Digital Office Automation System
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.vue 17KB

1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  1. <template>
  2. <div class="app-container">
  3. <el-form
  4. v-show="showSearch"
  5. ref="queryForm"
  6. :model="queryParams"
  7. size="small"
  8. :inline="true"
  9. class="app-container--search"
  10. >
  11. <el-form-item label="员工姓名" prop="sysUserName">
  12. <el-input
  13. v-model="queryParams.sysUserName"
  14. placeholder="请输入员工姓名"
  15. clearable
  16. @keyup.enter.native="handleQuery"
  17. />
  18. </el-form-item>
  19. <el-form-item label="打卡状态" prop="checkInStatus">
  20. <el-select
  21. v-model="queryParams.checkInStatus"
  22. placeholder="请选择打卡状态"
  23. clearable
  24. >
  25. <el-option
  26. v-for="dict in daka_check_in_status"
  27. :key="dict.value"
  28. :label="dict.label"
  29. :value="dict.value"
  30. />
  31. </el-select>
  32. </el-form-item>
  33. <el-form-item>
  34. <el-button
  35. type="primary"
  36. icon="el-icon-search"
  37. size="mini"
  38. @click="handleQuery"
  39. >搜索</el-button>
  40. <el-button
  41. icon="el-icon-refresh"
  42. size="mini"
  43. @click="resetQuery"
  44. >重置</el-button>
  45. </el-form-item>
  46. </el-form>
  47. <el-row :gutter="10" class="mb8">
  48. <!-- <el-col :span="1.5">
  49. <el-button
  50. v-hasPermi="['system:operationWarnresult:remove']"
  51. type="danger"
  52. plain
  53. icon="el-icon-delete"
  54. size="mini"
  55. :disabled="multiple"
  56. @click="handleDelete"
  57. >删除</el-button>
  58. </el-col> -->
  59. <el-col :span="1.5">
  60. <el-button
  61. v-hasPermi="['system:operationWarnresult:export']"
  62. type="warning"
  63. plain
  64. icon="el-icon-download"
  65. size="mini"
  66. @click="handleExport"
  67. >导出</el-button>
  68. </el-col>
  69. <el-col :span="8.5">
  70. <div class="block">
  71. <span class="demonstration">按日</span>
  72. <el-date-picker
  73. type="date"
  74. v-model="queryParams.strDay"
  75. size="mini"
  76. format="yyyy 年 MM 月 dd 日"
  77. value-format="yyyy-MM-dd"
  78. placeholder="选择日">
  79. </el-date-picker>
  80. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  81. <span class="demonstration">按月</span>
  82. <el-date-picker
  83. v-model="queryParams.strMonth"
  84. type="month"
  85. size="mini"
  86. format="yyyy 年 MM 月"
  87. value-format="yyyy-MM"
  88. placeholder="选择月">
  89. </el-date-picker>
  90. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  91. <el-select
  92. v-model="queryParams.modelType"
  93. placeholder="请选择导出模版"
  94. size="mini"
  95. clearable
  96. >
  97. <el-option
  98. v-for="dict in modelTypeDate"
  99. :key="dict.value"
  100. :label="dict.label"
  101. :value="dict.value"
  102. />
  103. </el-select>
  104. </div>
  105. </el-col>
  106. <right-toolbar :show-search.sync="showSearch" @queryTable="getList" />
  107. </el-row>
  108. <el-table
  109. v-loading="loading"
  110. :data="resultList"
  111. @selection-change="handleSelectionChange"
  112. >
  113. <!-- <el-table-column type="selection" width="55" align="center" /> -->
  114. <el-table-column v-if="false" label="主键ID" align="center" prop="id" />
  115. <el-table-column label="员工姓名" align="center" prop="sysUserName" >
  116. </el-table-column>
  117. <!-- <el-table-column label="姓名昵称" align="center" prop="nickName" >
  118. </el-table-column> -->
  119. <el-table-column label="考勤组" align="center" prop="attendanceGroupName" >
  120. </el-table-column>
  121. <el-table-column label="打卡时间" align="center" prop="checkInTime">
  122. </el-table-column>
  123. <el-table-column label="上班打卡状态" align="center" prop="clockInStatus" >
  124. <template slot-scope="scope">
  125. <span
  126. v-if="scope.row.checkInStatus == '0'"
  127. style="
  128. display: inline-flex;
  129. align-items: center;
  130. justify-content: center;
  131. text-align: center;
  132. "
  133. >
  134. 未打卡
  135. </span>
  136. <span
  137. v-if="scope.row.clockInStatus == '1'"
  138. style="
  139. display: inline-flex;
  140. align-items: center;
  141. justify-content: center;
  142. text-align: center;
  143. "
  144. >
  145. 上班已打卡
  146. </span>
  147. <span
  148. v-if="scope.row.clockInStatus == '2'"
  149. style="
  150. display: inline-flex;
  151. align-items: center;
  152. justify-content: center;
  153. text-align: center;
  154. "
  155. >
  156. 下班已打卡
  157. </span>
  158. <span
  159. v-if="scope.row.clockInStatus == '3'"
  160. style="
  161. display: inline-flex;
  162. align-items: center;
  163. justify-content: center;
  164. text-align: center;
  165. "
  166. >
  167. 迟到打卡
  168. </span>
  169. <span
  170. v-if="scope.row.clockInStatus == '4'"
  171. style="
  172. display: inline-flex;
  173. align-items: center;
  174. justify-content: center;
  175. text-align: center;
  176. "
  177. >
  178. 早退打卡
  179. </span>
  180. <span
  181. v-if="scope.row.clockInStatus == '5'"
  182. style="
  183. display: inline-flex;
  184. align-items: center;
  185. justify-content: center;
  186. text-align: center;
  187. "
  188. >
  189. 更新打卡
  190. </span>
  191. </template>
  192. </el-table-column>
  193. <el-table-column label="下班打卡状态" align="center" prop="clockOutStatus" >
  194. <template slot-scope="scope">
  195. <span
  196. v-if="scope.row.checkInStatus == '0'"
  197. style="
  198. display: inline-flex;
  199. align-items: center;
  200. justify-content: center;
  201. text-align: center;
  202. "
  203. >
  204. 未打卡
  205. </span>
  206. <span
  207. v-if="scope.row.clockOutStatus == '1'"
  208. style="
  209. display: inline-flex;
  210. align-items: center;
  211. justify-content: center;
  212. text-align: center;
  213. "
  214. >
  215. 上班已打卡
  216. </span>
  217. <span
  218. v-if="scope.row.clockOutStatus == '2'"
  219. style="
  220. display: inline-flex;
  221. align-items: center;
  222. justify-content: center;
  223. text-align: center;
  224. "
  225. >
  226. 下班已打卡
  227. </span>
  228. <span
  229. v-if="scope.row.clockOutStatus == '3'"
  230. style="
  231. display: inline-flex;
  232. align-items: center;
  233. justify-content: center;
  234. text-align: center;
  235. "
  236. >
  237. 迟到打卡
  238. </span>
  239. <span
  240. v-if="scope.row.clockOutStatus == '4'"
  241. style="
  242. display: inline-flex;
  243. align-items: center;
  244. justify-content: center;
  245. text-align: center;
  246. "
  247. >
  248. 早退打卡
  249. </span>
  250. <span
  251. v-if="scope.row.clockOutStatus == '5'"
  252. style="
  253. display: inline-flex;
  254. align-items: center;
  255. justify-content: center;
  256. text-align: center;
  257. "
  258. >
  259. 更新打卡
  260. </span>
  261. </template>
  262. </el-table-column>
  263. <!-- <el-table-column
  264. label="操作"
  265. align="center"
  266. width="220"
  267. class-name="small-padding fixed-width"
  268. >
  269. <template slot-scope="scope">
  270. <el-button
  271. v-if="scope.row.status == 0"
  272. v-hasPermi="['system:operationWarnresult:edit']"
  273. size="mini"
  274. type="text"
  275. icon="el-icon-circle-check"
  276. @click="handleDispose(scope.row)"
  277. >处理</el-button>
  278. <span
  279. v-else
  280. class="text-info"
  281. style="margin-right: 10px"
  282. >已处理</span>
  283. <el-button
  284. size="mini"
  285. type="text"
  286. icon="el-icon-camera"
  287. @click="handleView(scope.row)"
  288. >快照</el-button>
  289. <el-button
  290. v-hasPermi="['system:operationWarnresult:remove']"
  291. size="mini"
  292. type="text"
  293. icon="el-icon-delete"
  294. @click="handleDelete(scope.row)"
  295. >删除</el-button>
  296. </template>
  297. </el-table-column> -->
  298. </el-table>
  299. <pagination
  300. v-show="total > 0"
  301. :total="total"
  302. :page.sync="queryParams.pageNum"
  303. :limit.sync="queryParams.pageSize"
  304. @pagination="getList"
  305. />
  306. <!-- 添加或修改对话框 -->
  307. <el-dialog :title="title" :visible.sync="open" width="960px" append-to-body>
  308. <div class="warn-result" v-html="warnResult" />
  309. </el-dialog>
  310. </div>
  311. </template>
  312. <script>
  313. import {
  314. queryList,
  315. delOperationWarnresult,
  316. addOperationWarnresult,
  317. updateOperationWarnresult,
  318. exportExcel
  319. } from '@/api/daka/daka-record'
  320. import map from '@/views/components/daka/map';
  321. export default {
  322. name: 'dakarecord',
  323. dicts: [
  324. 'zs_operation_warn_types',
  325. 'zs_operation_status',
  326. 'zs_operation_compare_status',
  327. 'zs_operation_platform',
  328. 'daka_check_in_status'
  329. ],
  330. data() {
  331. return {
  332. // 按钮loading
  333. buttonLoading: false,
  334. // 遮罩层
  335. loading: true,
  336. // 选中数组
  337. ids: [],
  338. // 非单个禁用
  339. single: true,
  340. // 非多个禁用
  341. multiple: true,
  342. // 显示搜索条件
  343. showSearch: true,
  344. // 总条数
  345. total: 0,
  346. // 表格数据
  347. resultList: [],
  348. // 弹出层标题
  349. title: '',
  350. // 是否显示弹出层
  351. open: false,
  352. // 图片快照时间范围
  353. daterangeWarnTime: [],
  354. // 查询参数
  355. queryParams: {
  356. pageNum: 1,
  357. pageSize: 10,
  358. sysUserName: undefined,
  359. checkInStatus: undefined,
  360. exportRange: undefined,
  361. strDay: undefined,
  362. strMonth: undefined,
  363. modelType: undefined
  364. },
  365. modelTypeDate: [{label: '国内', value: 'guonei'},{label: '日本', value: 'riben'}],
  366. // 表单参数
  367. form: {},
  368. // 结果
  369. warnResult: '',
  370. // 表单校验
  371. rules: {
  372. snapshotUrl: [
  373. { required: true, message: '图片快照不能为空', trigger: 'blur' }
  374. ]
  375. },
  376. daka_check_in_status: [{label: '未打卡', value: '0'},{label: '上班已打卡', value: '1'},{label: '下班已打卡', value: '2'},
  377. {label: '迟到打卡', value: '3'},{label: '早退打卡', value: '4'}, {label: '更新打卡', value: '5'}],
  378. }
  379. },
  380. created() {
  381. this.getList()
  382. },
  383. methods: {
  384. /** 查询结果列表 */
  385. getList() {
  386. this.loading = true
  387. console.log(this.queryParams)
  388. queryList(this.queryParams).then((response) => {
  389. this.resultList = response.rows
  390. this.total = response.total
  391. this.loading = false
  392. })
  393. },
  394. // 取消按钮
  395. cancel() {
  396. this.open = false
  397. this.reset()
  398. },
  399. // 表单重置
  400. reset() {
  401. this.form = {
  402. id: undefined,
  403. warnTime: undefined,
  404. goodsSkuName: undefined,
  405. goodsSkuSn: undefined,
  406. initPrice: undefined,
  407. curPrice: undefined,
  408. priceChangeRatio: undefined,
  409. warnTypes: undefined,
  410. warnContent: undefined,
  411. status: undefined,
  412. snapshotUrl: undefined
  413. }
  414. this.resetForm('form')
  415. },
  416. /** 处理按钮操作 */
  417. handleDispose(row) {
  418. const _html = `
  419. <p class="warn-result-text">预警商品:<a href="${row.goodsSkuUrl}" target="_blank">${row.goodsSkuName}</a></p>
  420. <p class="warn-result-text">预警价格:${row.curPrice}</p>
  421. <p class="warn-result-text">预警时间:${row.warnTime}</p>
  422. <p class="warn-result-text">预警平台:${row.platform}</p>
  423. <p class="warn-result-text">预警备注:${row.remark}</p>
  424. <p class="warn-result-text">预警快照:<a href="${row.snapshotUrl}" target="_blank">点击查看</a></p>
  425. <p class="warn-result-tips">注:如果点击“稍后处理”,则预警结果将不会被处理,预警状态将不会被修改。如果点击“立即处理”,则当前商品基准价格将会被修改为预警价格,价格监控按照新的基准价格进行监控。</p>
  426. `
  427. this.$confirm(_html, '提示', {
  428. confirmButtonText: '立即处理',
  429. cancelButtonText: '稍后处理',
  430. dangerouslyUseHTMLString: true,
  431. closeOnClickModal: false,
  432. closeOnPressEscape: false,
  433. showClose: false,
  434. customClass: 'warn-result-message'
  435. }).then(() => {
  436. this.loading = true
  437. row.status = 1
  438. updateOperationWarnresult(row)
  439. .then((response) => {
  440. this.$modal.msgSuccess('处理成功')
  441. this.open = false
  442. this.getList()
  443. })
  444. .finally(() => {
  445. this.loading = false
  446. })
  447. })
  448. },
  449. /** 搜索按钮操作 */
  450. handleQuery() {
  451. this.queryParams.pageNum = 1
  452. this.getList()
  453. },
  454. /** 重置按钮操作 */
  455. resetQuery() {
  456. this.daterangeWarnTime = []
  457. this.resetForm('queryForm')
  458. this.handleQuery()
  459. },
  460. // 多选框选中数据
  461. handleSelectionChange(selection) {
  462. this.ids = selection.map((item) => item.id)
  463. this.single = selection.length !== 1
  464. this.multiple = !selection.length
  465. },
  466. handleView(row) {
  467. // 将状态设置为已处理
  468. this.open = true
  469. this.title = '预警结果'
  470. this.warnResult = row.warnContent
  471. },
  472. /** 提交按钮 */
  473. submitForm() {
  474. this.$refs['form'].validate((valid) => {
  475. if (valid) {
  476. this.buttonLoading = true
  477. if (this.form.id != null) {
  478. updateOperationWarnresult(this.form)
  479. .then((response) => {
  480. this.$modal.msgSuccess('修改成功')
  481. this.open = false
  482. this.getList()
  483. })
  484. .finally(() => {
  485. this.buttonLoading = false
  486. })
  487. } else {
  488. addOperationWarnresult(this.form)
  489. .then((response) => {
  490. this.$modal.msgSuccess('新增成功')
  491. this.open = false
  492. this.getList()
  493. })
  494. .finally(() => {
  495. this.buttonLoading = false
  496. })
  497. }
  498. }
  499. })
  500. },
  501. /** 删除按钮操作 */
  502. handleDelete(row) {
  503. const ids = row.id || this.ids
  504. this.$modal
  505. .confirm('是否确认删除预警结果编号为"' + ids + '"的数据项?')
  506. .then(() => {
  507. this.loading = true
  508. return delOperationWarnresult(ids)
  509. })
  510. .then(() => {
  511. this.loading = false
  512. this.getList()
  513. this.$modal.msgSuccess('删除成功')
  514. })
  515. .catch(() => {})
  516. .finally(() => {
  517. this.loading = false
  518. })
  519. },
  520. /** 导出按钮操作 */
  521. handleExport() {
  522. console.log(this.queryParams)
  523. if(this.queryParams.day && this.queryParams.month){
  524. this.$modal.msgError('日,月只能选择一个')
  525. return
  526. }
  527. if(!this.queryParams.strDay && !this.queryParams.strMonth){
  528. this.$modal.msgError('日,月必须选择一个')
  529. return
  530. }
  531. if(!this.queryParams.modelType){
  532. this.$modal.msgError('必须选择模版!')
  533. return
  534. }
  535. this.download(
  536. 'dk/record/exportNew',
  537. {
  538. ...this.queryParams
  539. },
  540. `result_${new Date().getTime()}.xlsx`
  541. )
  542. // exportExcel(this.queryParams).then(response => {
  543. // console.log(response)
  544. // // 创建Blob对象
  545. // const blob = new Blob([response.data], {
  546. // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  547. // });
  548. // // 创建下载链接
  549. // const url = window.URL.createObjectURL(blob);
  550. // const a = document.createElement('a');
  551. // a.href = url;
  552. // a.download = '用户数据.xlsx'; // 文件名
  553. // // 触发下载
  554. // document.body.appendChild(a);
  555. // a.click();
  556. // // 释放资源
  557. // document.body.removeChild(a);
  558. // window.URL.revokeObjectURL(url);
  559. // })
  560. }
  561. }
  562. }
  563. </script>
  564. <style lang="scss">
  565. .warn-result table {
  566. width: 100% !important;
  567. }
  568. .warn-result table td a {
  569. display: none;
  570. }
  571. .warn-result table img {
  572. width: 100% !important;
  573. }
  574. .warn-result-message {
  575. .warn-result-text {
  576. font-size: 14px;
  577. color: #303133;
  578. a {
  579. color: #409eff;
  580. text-decoration: underline;
  581. }
  582. }
  583. .warn-result-tips {
  584. font-size: 12px;
  585. color: #999;
  586. margin-top: 10px;
  587. }
  588. }
  589. </style>
  590. <style lang="scss" scoped>
  591. .goods--info {
  592. display: flex;
  593. flex-direction: column;
  594. justify-content: center;
  595. text-align: left;
  596. .el-link {
  597. font-size: 14px;
  598. display: -webkit-box;
  599. -webkit-line-clamp: 2;
  600. line-clamp: 2;
  601. -webkit-box-orient: vertical;
  602. overflow: hidden;
  603. }
  604. em {
  605. font-size: 12px;
  606. color: #999;
  607. font-style: normal;
  608. }
  609. }
  610. </style>