index.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. <template>
  2. <zj-tab-page ref="tabPage" :defaultActives="[{ key: 'list', label: $route.meta.title + '-列表', essential: true }]">
  3. <template slot-scope="{ activeKey, data }">
  4. <template-page
  5. v-if="activeKey == 'list'"
  6. ref="pageRef"
  7. :get-list="getList"
  8. :table-attributes="tableAttributes"
  9. :table-events="tableEvents"
  10. :options-evens-group="optionsEvensGroup"
  11. :moreParameters="moreParameters"
  12. :column-parsing="columnParsing"
  13. :operation="operation()"
  14. :exportList="exportList"
  15. :operationColumnWidth="80"
  16. >
  17. </template-page>
  18. <div v-if="~['add', 'edit', 'detail'].indexOf(activeKey)">
  19. <zj-form-container ref="formRef" :form-data="formData" :styleSwitch="false">
  20. <zj-form-module
  21. title=""
  22. label-width="110px"
  23. :showPackUp="false"
  24. :form-data="formData"
  25. :form-items="formItems"
  26. :disabled="formDialogType == 2"
  27. >
  28. </zj-form-module>
  29. </zj-form-container>
  30. <div slot="footer" class="dialog-footer">
  31. <el-button size="mini" @click="data.removeTab()">取 消</el-button>
  32. <el-button v-if="formDialogType !== 2" size="mini" @click="formConfirm(data.removeTab)" type="primary"
  33. >确 定</el-button
  34. >
  35. </div>
  36. </div>
  37. </template>
  38. </zj-tab-page>
  39. </template>
  40. <script>
  41. import TemplatePage from '@/components/template/template-page-1.vue'
  42. import import_mixin from '@/components/template/import_mixin.js'
  43. import ImageUpload from '@/components/file-upload'
  44. import { required, mobileRequired, mobile, httpUrl, email } from '@/components/template/rules_verify.js'
  45. import { listPageV2, pageExport, getDetail, add, edit, del, getExamine } from '@/api/workOrder/rewardsPunishmentsOrder'
  46. import { getWebsit } from '@/api/customerManagement'
  47. import { getWorker } from '@/api/auxiliaryFittings/auxiliarySalesOrder'
  48. import operation_mixin from '@/components/template/operation_mixin.js'
  49. export default {
  50. components: { TemplatePage, ImageUpload },
  51. mixins: [import_mixin, operation_mixin],
  52. data() {
  53. return {
  54. // 表格属性
  55. tableAttributes: {
  56. // 启用勾选列
  57. selectColumn: false
  58. },
  59. // 表格事件
  60. tableEvents: {
  61. 'selection-change': this.selectionChange
  62. },
  63. // 勾选选中行
  64. recordSelected: [],
  65. /** 表单变量 */
  66. formDialogType: 0,
  67. formDialogTitles: ['新增', '编辑', '详情'],
  68. formDialog: false,
  69. type: JSON.parse(localStorage.getItem('greemall_user')).type, //type=1商户, type=0网点
  70. formData: {
  71. companyName: JSON.parse(localStorage.getItem('greemall_user')).companyName,
  72. websit: {},
  73. websitName: '',
  74. websitId: '',
  75. worker: {},
  76. workerId: '',
  77. workerName: '',
  78. mobile: '',
  79. idcard: '',
  80. examineProjectName: '',
  81. examineProjectId: '',
  82. examineProjectType: '',
  83. examineProjectAmount: '',
  84. examineProject: {},
  85. orderBaseId: '',
  86. fileUrl: [],
  87. remark: ''
  88. },
  89. websitList: [],
  90. workerList: [],
  91. examineList: [],
  92. formType: 'add',
  93. formVisible: false
  94. }
  95. },
  96. computed: {
  97. // 事件组合
  98. optionsEvensGroup() {
  99. return [
  100. [
  101. [
  102. this.optionsEvensAuth('add', {
  103. click: () => {
  104. this.openForm('add')
  105. }
  106. })
  107. ]
  108. ]
  109. ]
  110. },
  111. // 更多参数
  112. moreParameters() {
  113. return []
  114. },
  115. formItems() {
  116. return [
  117. {
  118. md: 6,
  119. isShow: true,
  120. name: 'el-input',
  121. attributes: { placeholder: '请输入', disabled: true },
  122. formItemAttributes: {
  123. label: '所属商户',
  124. prop: 'companyName',
  125. rules: [...required]
  126. }
  127. },
  128. {
  129. md: 6,
  130. isShow: this.type == 1,
  131. name: 'slot-component',
  132. attributes: { placeholder: '请输入网点名称' },
  133. formItemAttributes: {
  134. label: '网点名称',
  135. prop: 'websitId',
  136. rules: [...required]
  137. },
  138. render: (h, { props, onInput }) => {
  139. var { value } = props
  140. return (
  141. <el-select
  142. v-model={this.formData.websit}
  143. disabled={this.formDialogType != 0}
  144. value-key="websitId"
  145. onChange={e => {
  146. this.formData.websitId = e.websitId
  147. this.formData.websitName = e.name
  148. this.formData.worker = {}
  149. this.formData.workerId = ''
  150. this.formData.workerName = ''
  151. this.formData.idcard = ''
  152. this.formData.mobile = ''
  153. this.getWorker()
  154. }}
  155. placeholder="请选择"
  156. style="width: 100%;"
  157. >
  158. {this.websitList.map((item, index) => {
  159. return <el-option key={item.websitId} label={item.name} value={item}></el-option>
  160. })}
  161. </el-select>
  162. )
  163. }
  164. },
  165. {
  166. md: 6,
  167. isShow: this.type == 0,
  168. name: 'el-input',
  169. attributes: { placeholder: '请输入网点名称', disabled: true },
  170. formItemAttributes: {
  171. label: '网点名称',
  172. prop: 'websitName',
  173. rules: [...required]
  174. }
  175. },
  176. {
  177. md: 6,
  178. isShow: true,
  179. name: 'slot-component',
  180. attributes: { placeholder: '请选择工程师' },
  181. formItemAttributes: {
  182. label: '选择工程师',
  183. prop: 'workerId',
  184. rules: [...required]
  185. },
  186. render: (h, { props, onInput }) => {
  187. var { value } = props
  188. return (
  189. <el-select
  190. v-model={this.formData.worker}
  191. disabled={this.formDialogType != 0}
  192. value-key="nickName"
  193. onChange={e => {
  194. this.formData.workerId = e.userId
  195. this.formData.workerName = e.nickName
  196. this.formData.idcard = e.idCard
  197. this.formData.mobile = e.mobile
  198. }}
  199. placeholder="请选择"
  200. style="width: 100%;"
  201. >
  202. {this.workerList.map((item, index) => {
  203. return <el-option key={item.userId} label={item.nickName} value={item}></el-option>
  204. })}
  205. </el-select>
  206. )
  207. }
  208. },
  209. {
  210. md: 6,
  211. isShow: true,
  212. name: 'el-input',
  213. attributes: { placeholder: '请输入' },
  214. formItemAttributes: {
  215. label: '身份证',
  216. prop: 'idcard',
  217. rules: this.formData.idcard
  218. ? [
  219. {
  220. pattern: /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/,
  221. message: '身份证号格式不正确',
  222. trigger: 'blur'
  223. }
  224. ]
  225. : []
  226. }
  227. },
  228. {
  229. md: 6,
  230. isShow: true,
  231. name: 'el-input',
  232. attributes: { placeholder: '请输入' },
  233. formItemAttributes: {
  234. label: '联系电话',
  235. prop: 'mobile',
  236. rules: this.formData.mobile
  237. ? [
  238. {
  239. pattern: /^((0\d{2,3}-\d{7,8})|(1[3456789]\d{9}))$/,
  240. message: '电话号码格式不正确',
  241. trigger: 'blur'
  242. }
  243. ]
  244. : []
  245. }
  246. },
  247. {
  248. md: 6,
  249. isShow: true,
  250. name: 'slot-component',
  251. attributes: { placeholder: '请选择考核项目' },
  252. formItemAttributes: {
  253. label: '选择考核项目',
  254. prop: 'examineProjectName',
  255. rules: [...required]
  256. },
  257. render: (h, { props, onInput }) => {
  258. var { value } = props
  259. return (
  260. <el-select
  261. v-model={this.formData.examineProject}
  262. disabled={this.formDialogType != 0}
  263. value-key="name"
  264. onChange={e => {
  265. this.formData.examineProjectId = e.id
  266. this.formData.examineProjectName = e.name
  267. this.formData.examineProjectType = e.type
  268. this.formData.examineProjectAmount = e.amount
  269. }}
  270. placeholder="请选择"
  271. style="width: 100%;"
  272. >
  273. {this.examineList.map((item, index) => {
  274. return <el-option key={item.id} label={item.name} value={item}></el-option>
  275. })}
  276. </el-select>
  277. )
  278. }
  279. },
  280. {
  281. md: 6,
  282. isShow: true,
  283. name: 'slot-component',
  284. attributes: {},
  285. formItemAttributes: {
  286. label: '考核类型',
  287. prop: 'examineProjectType',
  288. rules: [...required]
  289. },
  290. render: (h, { props, onInput }) => {
  291. var { value } = props
  292. return (
  293. <el-radio-group v-model={this.formData.examineProjectType}>
  294. <el-radio disabled={true} label="REWARD">
  295. 奖励
  296. </el-radio>
  297. <el-radio disabled={true} label="PUNISH">
  298. 惩罚
  299. </el-radio>
  300. </el-radio-group>
  301. )
  302. }
  303. },
  304. {
  305. md: 6,
  306. isShow: true,
  307. name: 'el-input',
  308. attributes: { placeholder: '请输入', type: 'number', disabled: true },
  309. formItemAttributes: {
  310. label: '考核金额',
  311. prop: 'examineProjectAmount',
  312. rules: [...required]
  313. }
  314. },
  315. {
  316. md: 6,
  317. isShow: true,
  318. name: 'el-input',
  319. attributes: { placeholder: '请输入' },
  320. formItemAttributes: {
  321. label: '关联工单号',
  322. prop: 'orderBaseId',
  323. rules: []
  324. }
  325. },
  326. {
  327. md: 24,
  328. isShow: true,
  329. name: 'slot-component',
  330. formItemAttributes: {
  331. label: '附件',
  332. prop: 'fileUrl',
  333. rules: []
  334. },
  335. render: (h, { props, onInput }) => {
  336. var { value } = props
  337. return <ImageUpload fileList={this.formData.fileUrl} limit={1} isEdit={this.formDialogType !== 2} />
  338. }
  339. },
  340. {
  341. md: 24,
  342. isShow: true,
  343. name: 'el-input',
  344. attributes: { placeholder: '请输入备注内容', type: 'textarea', rows: 5 },
  345. formItemAttributes: {
  346. label: '备注',
  347. prop: 'remark',
  348. rules: []
  349. }
  350. }
  351. ]
  352. }
  353. },
  354. created() {
  355. if (this.$route.query.id) {
  356. this.openForm('detail', this.$route.query.id)
  357. }
  358. },
  359. methods: {
  360. // 列表请求函数
  361. getList: listPageV2,
  362. // 列表导出函数
  363. exportList: pageExport,
  364. // 表格列解析渲染数据更改
  365. columnParsing(item, defaultData) {
  366. if (item.jname === 'fileUrl') {
  367. defaultData.render = (h, { row, index, column }) => {
  368. return (
  369. <div style="padding:0 6px;cursor: pointer;">
  370. {row.fileUrl
  371. ? row.fileUrl
  372. .split(',')
  373. .map(url => (
  374. <el-image
  375. src={this.$showImgUrl(url)}
  376. preview-src-list={[this.$showImgUrl(url)]}
  377. fit="fit"
  378. style="width:80px;height:80px;"
  379. />
  380. ))
  381. : null}
  382. </div>
  383. )
  384. }
  385. }
  386. return defaultData
  387. },
  388. // 监听勾选变化
  389. selectionChange(data) {
  390. this.recordSelected = data
  391. },
  392. operation() {
  393. return this.operationBtn({
  394. detail: {
  395. click: ({ row, index, column }) => {
  396. this.openForm('detail', row.id)
  397. }
  398. }
  399. })
  400. },
  401. openDetail(id) {
  402. getDetail({ id }).then(res => {
  403. Object.assign(this.formData, res.data, {
  404. fileUrl: res.data?.fileUrl ? res.data?.fileUrl?.split(',').map(item => ({ url: item })) : [],
  405. worker: { workerId: res.data.workerId, nickName: res.data.workerName },
  406. websit: { websitId: res.data.websitId, websitName: res.data.websitName },
  407. examineProject: { name: res.data.examineProjectName }
  408. })
  409. this.getExamine()
  410. this.getWebsit()
  411. this.getWorker()
  412. })
  413. },
  414. getExamine() {
  415. getExamine({ pageNum: 1, pageSize: -1, params: [] }).then(res => {
  416. this.examineList = res.data.records
  417. })
  418. },
  419. getWebsit() {
  420. if (this.type == 0) {
  421. // this.formData.websitId = JSON.parse(localStorage.getItem('greemall_user')).adminWebsitId
  422. // this.formData.websitName = JSON.parse(localStorage.getItem('greemall_user')).nickName
  423. } else {
  424. getWebsit({ type: 'C' }).then(res => {
  425. this.websitList = res.data
  426. })
  427. }
  428. },
  429. getWorker() {
  430. getWorker({
  431. pageNum: 1,
  432. pageSize: -1,
  433. params: [{ param: 'b.websit_id', compare: '=', value: this.formData.websitId }]
  434. }).then(res => {
  435. this.workerList = res.data.records
  436. })
  437. },
  438. openForm(type, id) {
  439. this.$refs.tabPage.addTab({
  440. // 对应显示的模块
  441. activeKey: type,
  442. // 唯一标识
  443. key: type,
  444. // 页签名称
  445. label: { edit: '编辑', add: '新增', detail: '详情' }[type],
  446. // 打开时事件
  447. triggerEvent: () => {
  448. this.formCancel()
  449. this.$nextTick(() => {
  450. this.formType = type
  451. this.formVisible = true
  452. if (type == 'add') {
  453. this.getExamine()
  454. this.getWebsit()
  455. this.formDialogType = 0
  456. } else {
  457. this.formDialogType = 2
  458. this.openDetail(id)
  459. }
  460. })
  461. },
  462. // 关闭时事件
  463. closeEvent: () => {}
  464. })
  465. },
  466. formCancel() {
  467. this.formVisible = false
  468. this.$refs?.formRef?.resetFields()
  469. this.$data.formData = this.$options.data().formData
  470. },
  471. formConfirm(cancel) {
  472. this.$refs.formRef.validate((valid, invalidFields, errLabels) => {
  473. if (valid) {
  474. ;[add, edit]
  475. [this.formDialogType]({
  476. ...this.formData,
  477. fileUrl: this.formData.fileUrl.map(item => item.url).join(',')
  478. })
  479. .then(res => {
  480. this.$message({ type: 'success', message: `${this.formDialogTitles[this.formDialogType]}成功!` })
  481. cancel('list')
  482. this.$refs.pageRef.refreshList()
  483. })
  484. }
  485. })
  486. }
  487. }
  488. }
  489. </script>
  490. <style lang="scss" scoped>
  491. .tab {
  492. padding: 20px 20px 0 20px;
  493. }
  494. </style>