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. <div :style="{
  5. width: '100%',
  6. height: activeKey == 'list' ? '100%' : '0px',
  7. overflow: 'hidden'
  8. }">
  9. <template-page ref="pageRef" :get-list="getList" :table-attributes="tableAttributes" :table-events="tableEvents" :operationColumnWidth="280"
  10. :options-evens-group="optionsEvensGroup" :moreParameters="moreParameters" :column-parsing="columnParsing"
  11. :operation="operation()">
  12. <!-- :exportList="exportList" -->
  13. <div slot="moreSearch">
  14. <el-radio-group v-model="examineStatus" size="mini" @change="changeType">
  15. <el-radio-button label="">全部</el-radio-button>
  16. <el-radio-button label="WAIT">待审核</el-radio-button>
  17. <el-radio-button label="OK">审核通过</el-radio-button>
  18. <el-radio-button label="FAIL">驳回</el-radio-button>
  19. </el-radio-group>
  20. <br><br>
  21. </div>
  22. </template-page>
  23. </div>
  24. <div v-if="~['examine','detail'].indexOf(activeKey)" style="box-sizing: border-box;padding: 16px;">
  25. <zj-form-container ref="formRef" :form-data="formData" :styleSwitch="false">
  26. <zj-form-module title="" label-width="100px" :showPackUp="false"
  27. :form-data="formData" :form-items="formItems">
  28. </zj-form-module>
  29. </zj-form-container>
  30. <div slot="footer" class="dialog-footer">
  31. <el-button v-if="formData.examineStatus == 'WAIT'" size="mini" type="primary" @click="audit('OK', data.removeTab)">审核通过</el-button>
  32. <el-button v-if="formData.examineStatus == 'WAIT'" size="mini" type="danger" @click="audit('FAIL', data.removeTab)">审核驳回</el-button>
  33. <el-button size="mini" @click="data.removeTab()">取 消</el-button>
  34. </div>
  35. </div>
  36. <div v-if="~['worker'].indexOf(activeKey)" style="box-sizing: border-box;padding: 16px;">
  37. <el-form ref="workerForm" :model="workerForm" label-width="110px" size="small" label-position="left">
  38. <el-row :gutter="20">
  39. <el-col :span="6">
  40. <el-form-item label="入驻网点" :required="true">
  41. <el-select v-model="workerForm.websitId" placeholder="请选择" style="width: 100%;">
  42. <el-option
  43. v-for="item in websitList"
  44. :key="item.websitId"
  45. :label="item.name"
  46. :value="item.websitId">
  47. </el-option>
  48. </el-select>
  49. </el-form-item>
  50. </el-col>
  51. <el-col :span="6">
  52. <el-form-item label="姓名" :required="true">
  53. <el-input v-model="workerForm.name" placeholder="请输入"></el-input>
  54. </el-form-item>
  55. </el-col>
  56. <el-col :span="6">
  57. <el-form-item label="身份证号码" :required="true">
  58. <el-input v-model="workerForm.idCard" placeholder="请输入"></el-input>
  59. </el-form-item>
  60. </el-col>
  61. <el-col :span="6">
  62. <el-form-item label="银行卡号">
  63. <el-input v-model="workerForm.bankAccount" placeholder="请输入"></el-input>
  64. </el-form-item>
  65. </el-col>
  66. <el-col :span="24">
  67. <el-form-item label="身份证正面照" :required="true">
  68. <ImageUpload :fileList="fileList" :limit="1" :isEdit="true" />
  69. </el-form-item>
  70. </el-col>
  71. <el-col :span="24" v-for="(item,index) in imgList" :key="index">
  72. <el-form-item :label="item.dictValue" :required="true">
  73. <ImageUpload :fileList="item.imgs" :limit="1" :isEdit="true" />
  74. </el-form-item>
  75. </el-col>
  76. </el-row>
  77. </el-form>
  78. <div slot="footer" class="dialog-footer">
  79. <el-button @click="data.removeTab()">取 消</el-button>
  80. <el-button type="primary" @click="memberInner(data.removeTab)">确定</el-button>
  81. </div>
  82. </div>
  83. </template>
  84. </zj-tab-page>
  85. </template>
  86. <script>
  87. import TemplatePage from '@/components/template/template-page-1.vue'
  88. import import_mixin from '@/components/template/import_mixin.js'
  89. import ImageUpload from '@/components/file-upload'
  90. import { required, mobileRequired, mobile } from '@/components/template/rules_verify.js'
  91. import { memberListService2,memberPageExport, getMemberDetail, memberAudit, memberInner, memberInsideInner, getWebsit } from "@/api/distributorManagement";
  92. import operation_mixin from '@/components/template/operation_mixin.js'
  93. import request from '@/utils/request'
  94. export default {
  95. components: { TemplatePage, ImageUpload },
  96. mixins: [import_mixin,operation_mixin],
  97. data() {
  98. return {
  99. // 事件组合
  100. optionsEvensGroup: [],
  101. // 表格属性
  102. tableAttributes: {
  103. // 启用勾选列
  104. selectColumn: false,
  105. 'row-class-name': this.tableRowClassName
  106. },
  107. // 表格事件
  108. tableEvents: {
  109. 'selection-change': this.selectionChange
  110. },
  111. // 勾选选中行
  112. recordSelected: [],
  113. /** 表单变量 */
  114. formDialogType: 0,
  115. formDialogTitles: ["审核", "详情"],
  116. formDialog: false,
  117. dialogVisible: false,
  118. formData: {
  119. type: '工程师',
  120. examineRemark: '',
  121. examineStatus: ''
  122. },
  123. examineStatus: '',
  124. websitList: [],
  125. workerForm: {
  126. websitId: '',
  127. userId: '',
  128. idCard: '',
  129. name: '',
  130. bankAccount: ''
  131. },
  132. fileList: [],
  133. imgList: []
  134. }
  135. },
  136. computed: {
  137. // 更多参数
  138. moreParameters() {
  139. return []
  140. },
  141. formItems() {
  142. return [{
  143. md: 12,
  144. isShow: true,
  145. name: 'el-select',
  146. options: [{label: '待审核', value: 'WAIT'},{label: '驳回', value: 'FAIL'},{label: '通过', value: 'OK'}],
  147. attributes: { placeholder: '请输入', disabled: true },
  148. formItemAttributes: {
  149. label: '审核状态',
  150. prop: 'examineStatus',
  151. rules: []
  152. },
  153. }, {
  154. md: 12,
  155. isShow: true,
  156. name: 'el-select',
  157. options: [{label: '业务员', value: 'SERVICE'},{label: '师傅', value: 'WORKER'},{label: '普通用户', value: 'GENERAL'}],
  158. attributes: { disabled: true },
  159. formItemAttributes: {
  160. label: '用户类型',
  161. prop: 'type',
  162. rules: []
  163. }
  164. }, {
  165. md: 12,
  166. isShow: true,
  167. name: 'el-input',
  168. attributes: { placeholder: '请输入', disabled: true },
  169. formItemAttributes: {
  170. label: '用户名称',
  171. prop: 'nickName',
  172. rules: []
  173. }
  174. }, {
  175. md: 12,
  176. isShow: true,
  177. name: 'el-input',
  178. attributes: { placeholder: '请输入', disabled: true },
  179. formItemAttributes: {
  180. label: '联系电话',
  181. prop: 'mobile',
  182. rules: []
  183. }
  184. }, {
  185. md: 12,
  186. isShow: true,
  187. name: 'el-input',
  188. attributes: { placeholder: '请输入', disabled: true },
  189. formItemAttributes: {
  190. label: '身份证号码',
  191. prop: 'idCard',
  192. rules: []
  193. }
  194. }, {
  195. md: 12,
  196. isShow: true,
  197. name: 'slot-component',
  198. attributes: {},
  199. formItemAttributes: {
  200. label: '身份证',
  201. prop: 'idCardImg',
  202. rules: []
  203. },
  204. render: (h, { props, onInput }) => {
  205. var { value } = props
  206. console.log(this.formData.idCardImg)
  207. return (
  208. this.formData.idCardImg ? <el-image src={this.formData.idCardImg} style='width: 120px;height:120px' preview-src-list={[this.formData.idCardImg]} fit="cover"></el-image> : ''
  209. )
  210. }
  211. }, {
  212. md: 12,
  213. isShow: true,
  214. name: 'el-input',
  215. attributes: { placeholder: '请输入', disabled: true },
  216. formItemAttributes: {
  217. label: '所属商户',
  218. prop: 'companyName',
  219. rules: []
  220. }
  221. }, {
  222. md: 24,
  223. isShow: true,
  224. name: 'el-input',
  225. attributes: { placeholder: '请输入',type: "textarea", disabled: this.formData.examineStatus == 'WAIT' ? false:true },
  226. formItemAttributes: {
  227. label: '备注',
  228. prop: 'examineRemark',
  229. rules: []
  230. }
  231. }]
  232. }
  233. },
  234. created(){
  235. this.getImgList()
  236. },
  237. methods: {
  238. // 切换状态
  239. changeType(val) {
  240. this.$refs.pageRef.refreshList()
  241. },
  242. // 列表请求函数
  243. getList(p) {
  244. try {
  245. var pam = JSON.parse(JSON.stringify(p))
  246. if (this.examineStatus) {
  247. pam.params.push({ "param": "a.examine_status", "compare": "=", "value": this.examineStatus })
  248. }
  249. return memberListService2(pam)
  250. } catch (error) {
  251. console.log(error)
  252. }
  253. },
  254. getImgList(){
  255. request({
  256. url: `/dictCompany/page`,
  257. method: 'post',
  258. data: { pageNum: 1, pageSize: -1, params: [{param: "a.dict_type", compare: "=", value: "WORKER_IMG"}] }
  259. }).then(res=>{
  260. this.imgList = res.data.records.filter(item=>{
  261. return item.imgs = []
  262. })
  263. })
  264. },
  265. // 列表导出函数
  266. exportList: memberPageExport,
  267. // 表格列解析渲染数据更改
  268. columnParsing(item, defaultData) {
  269. if (item.jname === 'idCardImg') {
  270.     defaultData.render = (h, { row, index, column }) => {
  271.       return (
  272.         <div style="padding:0 6px;cursor: pointer;">
  273.           {row.idCardImg ? row.idCardImg.split(",").map(url => <el-image src={url} preview-src-list={[url]} fit="fit" style="width:80px;height:80px;" />) : null}
  274.           </div>
  275.       )
  276.     }
  277. }
  278. return defaultData
  279. },
  280. // 监听勾选变化
  281. selectionChange(data) {
  282. this.recordSelected = data
  283. },
  284. guanbi() {
  285. this.$refs?.formRef?.$refs?.inlineForm?.clearValidate()
  286. this.$data.formData = this.$options.data().formData
  287. },
  288. tableRowClassName({row, rowIndex}){
  289. if(row.examineStatus==="待审核"){
  290. return 'redbackground'
  291. }else{
  292. return ''
  293. }
  294. },
  295. // 表格操作列
  296. operation() {
  297. return this.operationBtn({
  298. detail: {
  299. btnType: 'text',
  300. click: ({ row, index, column }) => {
  301. this.$refs.tabPage.addTab({
  302. activeKey: "detail",
  303. key: "detail",
  304. label: "详情",
  305. triggerEvent: () => {
  306. this.guanbi()
  307. this.$nextTick(() => {
  308. getMemberDetail({ userId: row.userId }).then(res => {
  309. Object.assign(this.formData, res.data)
  310. this.formDialogType = 1
  311. })
  312. })
  313. },
  314. })
  315. }
  316. },
  317. examine: {
  318. btnType: 'text',
  319. conditions: ({ row, index, column }) => {
  320. return row.examineStatus == 'WAIT'
  321. },
  322. click: ({ row, index, column }) => {
  323. this.$refs.tabPage.addTab({
  324. activeKey: "examine",
  325. key: "examine",
  326. label: "审核",
  327. triggerEvent: () => {
  328. this.guanbi()
  329. this.$nextTick(() => {
  330. this.workerForm.userId = row.userId
  331. getMemberDetail({ userId: row.userId }).then(res => {
  332. Object.assign(this.formData, res.data)
  333. })
  334. })
  335. },
  336. closeEvent: () => {
  337. }
  338. })
  339. }
  340. },
  341. setWorker: {
  342. btnType: 'text',
  343. // prompt: '请确认是否设为工程师?',
  344. conditions: ({ row, index, column }) => {
  345. return row.examineStatus != 'WAIT'
  346. },
  347. click: ({ row, index, column }) => {
  348. this.$refs.tabPage.addTab({
  349. activeKey: "worker",
  350. key: "worker",
  351. label: "设为工程师",
  352. triggerEvent: () => {
  353. this.guanbi()
  354. this.$nextTick(() => {
  355. this.workerForm.userId = row.userId
  356. getWebsit({type: 'C'}).then(res => {
  357. this.websitList = res.data
  358. this.dialogVisible = true
  359. })
  360. })
  361. },
  362. closeEvent: () => {
  363. }
  364. })
  365. }
  366. },
  367. setCustomer: {
  368. btnType: 'text',
  369. prompt: '请确认是否设为客户?',
  370. click: ({ row, index, column }) => {
  371. memberInner({
  372. type: 'GENERAL',
  373. userId: row.userId
  374. }).then(res => {
  375. if (res.code == 200) {
  376. this.$message({ type: 'success', message: '设为客户成功!' })
  377. this.$refs.pageRef.refreshList()
  378. } else {
  379. this.$message.error(res.msg);
  380. }
  381. })
  382. }
  383. },
  384. setService: {
  385. name: ({ row, index, column }) => {
  386. return `${row.innerr?'取消':'设为'}内部分销员`
  387. },
  388. btnType: 'text',
  389. prompt: ({ row, index, column }) => {
  390. return `请确认是否${row.innerr?'取消':'设为'}内部分销员?`
  391. },
  392. click: ({ row, index, column }) => {
  393. memberInsideInner({
  394. innerr: !row.innerr,
  395. userIds: row.userId
  396. }).then(res => {
  397. if (res.code == 200) {
  398. this.$message({ type: 'success', message: (row.innerr?'取消':'设为')+ '内部分销员成功!' })
  399. this.$refs.pageRef.refreshList()
  400. } else {
  401. this.$message.error(res.msg);
  402. }
  403. })
  404. }
  405. },
  406. })
  407. },
  408. addData() {
  409. this.formDialogType = 0
  410. this.openForm()
  411. },
  412. openForm() {
  413. this.formDialog = true;
  414. },
  415. formCancel() {
  416. this.$refs.formRef.$refs.inlineForm.clearValidate()
  417. this.$data.formData = this.$options.data().formData
  418. this.formDialog = false
  419. },
  420. audit(examineStatusEnum, removeTab){
  421. memberAudit({
  422. examineStatusEnum,
  423. examineRemark: this.formData.examineRemark,
  424. id: this.formData.id,
  425. userId: this.workerForm.userId,
  426. }).then(res => {
  427. this.$message({ type: 'success', message: '审核成功!' })
  428. this.formCancel()
  429. removeTab('list')
  430. this.$refs.pageRef.refreshList()
  431. })
  432. },
  433. memberInner(removeTab){
  434. let workerImgs = []
  435. for(var i = 0;i < this.imgList.length;i++){
  436. if(this.imgList[i].imgs.length == 0){
  437. return this.$message({ type: 'error', message: '请上传' + this.imgList[i].dictValue +'!' })
  438. break;
  439. }else{
  440. workerImgs.push({
  441. imgName: this.imgList[i].dictValue,
  442. imgUrl: this.imgList[i].imgs.length>0?this.imgList[i].imgs[0].url:''
  443. })
  444. }
  445. }
  446. if(!this.workerForm.websitId){
  447. return this.$message({ type: 'error', message: '请选择入驻网点!' })
  448. }else if(!this.workerForm.name){
  449. return this.$message({ type: 'error', message: '请输入姓名!' })
  450. }else if(!this.workerForm.idCard){
  451. return this.$message({ type: 'error', message: '请输入身份证号码!' })
  452. }else if(!/^\d{6}(18|19|20)\d{2}(0\d|10|11|12)([0-2]\d|30|31)\d{3}[\dXx]$/g.test(this.workerForm.idCard)){
  453. return this.$message({ type: 'error', message: '请输入正确的身份证号码!' })
  454. }else if(this.fileList.length == 0){
  455. return this.$message({ type: 'error', message: '请上传身份证正面照!' })
  456. }
  457. memberInner({
  458. type: 'WORKER',
  459. userId: this.workerForm.userId,
  460. websitId: this.workerForm.websitId,
  461. name: this.workerForm.name,
  462. idCard: this.workerForm.idCard,
  463. bankAccount: this.workerForm.bankAccount,
  464. idCardImg: this.fileList.map(item => item.url).join(","),
  465. workerImgs
  466. }).then(res => {
  467. removeTab('list')
  468. this.dialogVisible = false
  469. this.$message({ type: 'success', message: '设置工程师成功!' })
  470. this.$refs.pageRef.refreshList()
  471. })
  472. },
  473. formConfirm() {
  474. this.$refs.formRef.validate((valid, invalidFields, errLabels) => {
  475. if (valid) {
  476. ([memberAudit][this.formDialogType])(this.formData).then(res => {
  477. this.$message({ type: 'success', message: `${this.formDialogTitles[this.formDialogType]}成功!` })
  478. this.formCancel()
  479. this.$refs.pageRef.refreshList()
  480. })
  481. }
  482. })
  483. }
  484. }
  485. }
  486. </script>
  487. <style lang="scss" scoped></style>
  488. <style lang="scss" >
  489. .redbackground {
  490. background: rgb(248, 185, 185) !important;
  491. }
  492. .lcsebackground{
  493. background: rgb(212, 245, 212) !important;
  494. }
  495. </style>