Digital Office Automation System
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

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