add-dialog.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. <template>
  2. <!-- 上传 -->
  3. <ele-modal
  4. :title="title"
  5. :visible.sync="dialogVisible"
  6. @close="close"
  7. width="60%"
  8. :maxable="true"
  9. >
  10. <el-form ref="form" :model="form" :rules="rules" label-width="82px">
  11. <el-row :gutter="15">
  12. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  13. <el-form-item prop="holderType" label="持证类型">
  14. <el-select
  15. style="width: 100%"
  16. v-model="form.holderType"
  17. @change="holderTypeChange"
  18. >
  19. <el-option
  20. :label="item.label"
  21. :value="item.value"
  22. v-for="(item, index) in holderTypeOptions"
  23. :key="index"
  24. >
  25. </el-option>
  26. </el-select>
  27. </el-form-item>
  28. </el-col>
  29. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  30. <el-form-item prop="type" label="证件类型">
  31. <DictSelection
  32. v-model="form.type"
  33. dictName="证件类型"
  34. v-if="['1'].includes(form.holderType)"
  35. ></DictSelection>
  36. <DictSelection
  37. v-model="form.type"
  38. dictName="客户/供应商资质类型"
  39. v-if="['2', '3', '4', '5', '6'].includes(form.holderType)"
  40. ></DictSelection>
  41. </el-form-item>
  42. </el-col>
  43. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  44. <el-form-item prop="code" label="证照编号">
  45. <el-input placeholder="请输入" v-model="form.code"></el-input>
  46. </el-form-item>
  47. </el-col>
  48. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  49. <el-form-item label="等级:" prop="level">
  50. <el-select style="width: 100%" v-model="form.level" filterable>
  51. <el-option
  52. :label="item.label"
  53. :value="item.value"
  54. v-for="(item, index) in levelOptions"
  55. :key="index"
  56. >
  57. </el-option>
  58. </el-select>
  59. </el-form-item>
  60. </el-col>
  61. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  62. <el-form-item prop="status" label="状态">
  63. <DictSelection
  64. v-model="form.status"
  65. dictName="规则状态"
  66. ></DictSelection>
  67. </el-form-item>
  68. </el-col>
  69. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  70. <el-form-item prop="holder" label="持证对象">
  71. <el-input
  72. v-if="form.holderType != 2"
  73. v-model="form.holder"
  74. clearable
  75. readonly
  76. placeholder="请选择"
  77. @click.native="openStaffSelection"
  78. ></el-input>
  79. <ele-tree-select
  80. v-if="form.holderType == 2"
  81. ref="tree"
  82. clearable
  83. :data="companyData"
  84. label-key="name"
  85. value-key="id"
  86. default-expand-all
  87. v-model="form.holder"
  88. @change="handleChange"
  89. />
  90. </el-form-item>
  91. </el-col>
  92. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  93. <el-form-item label="颁发时间">
  94. <el-date-picker
  95. style="width: 100%"
  96. v-model="form.enactorTime"
  97. type="date"
  98. value-format="yyyy-MM-dd HH:mm:ss"
  99. placeholder="选择日期"
  100. >
  101. </el-date-picker>
  102. </el-form-item>
  103. </el-col>
  104. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  105. <el-form-item prop="validityStartTime" label="有效期至">
  106. <div style="display: flex">
  107. <el-date-picker
  108. style="flex: 1"
  109. v-model="form.validityStartTime"
  110. type="date"
  111. value-format="yyyy-MM-dd HH:mm:ss"
  112. placeholder="选择日期"
  113. @change="handleTimeChange('validityStartTime')"
  114. >
  115. </el-date-picker>
  116. <div style="width: 40px; text-align: center">至</div>
  117. <el-date-picker
  118. style="flex: 1"
  119. v-model="form.validityEndTime"
  120. type="date"
  121. value-format="yyyy-MM-dd HH:mm:ss"
  122. placeholder="选择日期"
  123. @change="handleTimeChange('validityEndTime')"
  124. >
  125. </el-date-picker>
  126. </div>
  127. <!-- <el-date-picker
  128. style="width: 100%"
  129. v-model="form.date"
  130. type="daterange"
  131. range-separator="至"
  132. start-placeholder="开始日期"
  133. end-placeholder="结束日期"
  134. value-format="yyyy-MM-dd HH:mm:ss"
  135. :default-time="['00:00:00', '23:59:59']"
  136. >
  137. </el-date-picker> -->
  138. </el-form-item>
  139. </el-col>
  140. <el-col v-bind="styleResponsive ? { sm: 24 } : { span: 24 }">
  141. <el-form-item prop="fileObj" label="附件">
  142. <fileMain v-model="form.fileObj" @updateVal="handleFileSuccess" />
  143. </el-form-item>
  144. </el-col>
  145. <el-col v-bind="styleResponsive ? { sm: 24 } : { span: 24 }">
  146. <el-form-item prop="remark" label="备注">
  147. <el-input
  148. placeholder="请输入"
  149. v-model="form.remark"
  150. type="textarea"
  151. :rows="3"
  152. :resize="`none`"
  153. ></el-input>
  154. </el-form-item>
  155. </el-col>
  156. </el-row>
  157. </el-form>
  158. <staffSelection
  159. ref="staffSelection"
  160. @confirm="confirmStaffSelection"
  161. ></staffSelection>
  162. <productTable ref="productTableRef" />
  163. <vendorDialog
  164. ref="supplierSelectionRef"
  165. @success="confirmStaffSelection1"
  166. ></vendorDialog>
  167. <clientDialog
  168. ref="customerSelectionRef"
  169. @success="confirmStaffSelection1"
  170. ></clientDialog>
  171. <!-- <supplierSelection
  172. ref="supplierSelectionRef"
  173. @confirm="confirmStaffSelection"
  174. />
  175. <customerSelection
  176. ref="customerSelectionRef"
  177. @confirm="confirmStaffSelection"
  178. /> -->
  179. <div slot="footer" class="dialog-footer">
  180. <el-button size="small" @click="save" type="primary">保 存</el-button>
  181. <el-button size="small" @click="close">关 闭</el-button>
  182. </div>
  183. </ele-modal>
  184. </template>
  185. <script>
  186. import staffSelection from './staffSelection.vue';
  187. import { saveOrEdit, getPhotoInfo } from '@/api/documentManagement';
  188. import clientDialog from '@/views/factoryModel/qualificationManagement/components/clientDialog.vue';
  189. import vendorDialog from '@/views/factoryModel/qualificationManagement/components/vendorDialog.vue';
  190. import { getCode } from '@/api/ruleManagement/matter';
  191. import productTable from './productTable.vue';
  192. // import supplierSelection from './supplierSelection.vue';
  193. // import customerSelection from './customerSelection.vue';
  194. import { listOrganizations } from '@/api/system/organization';
  195. import { holderTypeOptions } from '@/enum/dict.js';
  196. const defaultForm = {
  197. code: '',
  198. holder: '',
  199. holderId: '',
  200. type: '',
  201. date: [],
  202. fileObj: [],
  203. holderType: '',
  204. status: 1
  205. };
  206. export default {
  207. components: {
  208. staffSelection,
  209. productTable,
  210. vendorDialog,
  211. clientDialog
  212. // fileMain
  213. },
  214. //注册组件
  215. data() {
  216. return {
  217. dialogVisible: false,
  218. levelOptions: [
  219. {
  220. label: '初级',
  221. value: '1'
  222. },
  223. {
  224. label: '中级',
  225. value: '2'
  226. },
  227. {
  228. label: '高级',
  229. value: '3'
  230. }
  231. ],
  232. rules: {
  233. // code: [
  234. // { required: true, trigger: 'blur', message: '请输入证照编号' }
  235. // ],
  236. // level: [{ required: true, trigger: 'change', message: '选择等级' }],
  237. type: [
  238. { required: true, trigger: 'change', message: '请选择证件类型' }
  239. ],
  240. validityStartTime: [
  241. {
  242. required: true,
  243. trigger: 'change',
  244. message: '请选择有效期开始时间'
  245. }
  246. ],
  247. validityEndTime: [
  248. {
  249. required: true,
  250. trigger: 'change',
  251. message: '请选择有效期结束时间'
  252. }
  253. ],
  254. holder: [
  255. { required: true, trigger: 'change', message: '请选择持证对象' }
  256. ],
  257. status: [
  258. { required: true, trigger: 'change', message: '请选择状态' }
  259. ],
  260. fileObj: [{ required: true, trigger: 'change', message: '请选择' }]
  261. },
  262. form: { ...defaultForm },
  263. title: '新增',
  264. holderTypeOptions,
  265. companyData: [] //公司分类
  266. };
  267. },
  268. computed: {
  269. // 是否开启响应式布局
  270. styleResponsive() {
  271. return this.$store.state.theme.styleResponsive;
  272. }
  273. },
  274. created() {
  275. this.getCompanyData();
  276. },
  277. methods: {
  278. handleFileSuccess() {
  279. this.$refs.form.validateField('fileObj');
  280. },
  281. //选择负责人
  282. confirmStaffSelection(data) {
  283. this.form.holderId = data.map((item) => item.id).join(',');
  284. this.form.holder = data.map((item) => item.name).join(',');
  285. this.$forceUpdate();
  286. console.log(this.form);
  287. },
  288. confirmStaffSelection1(data) {
  289. this.form.holderId = data.id;
  290. this.form.holder = data.name;
  291. },
  292. openStaffSelection() {
  293. if (this.form.holderType == 1) {
  294. this.$refs.staffSelection.open([]);
  295. } else if (this.form.holderType == 3 || this.form.holderType == 6) {
  296. this.$refs.supplierSelectionRef.open([]);
  297. } else if (this.form.holderType == 4) {
  298. this.$refs.customerSelectionRef.open([]);
  299. }
  300. },
  301. open(row) {
  302. this.$refs.form && this.$refs.form.clearValidate();
  303. this.dialogVisible = true;
  304. if (row) {
  305. this.title = '修改';
  306. this.getInfo(row.id);
  307. } else {
  308. this.title = '新增';
  309. }
  310. },
  311. async getOrderCode() {
  312. const data = await getCode('license_code');
  313. this.$set(this.form, 'code', data);
  314. },
  315. async getInfo(id) {
  316. const data = await getPhotoInfo(id);
  317. this.form = {
  318. ...data,
  319. // date: [data.validityStartTime, data.validityEndTime],
  320. holderType: data.holderType || '1',
  321. type: data.holderType === '1' ? data.type : data.type + ''
  322. };
  323. this.$refs.productTableRef.putTableValue(data.categorys || []);
  324. },
  325. close() {
  326. this.dialogVisible = false;
  327. // this.$refs.form.resetFields()
  328. this.form = { ...defaultForm };
  329. this.$refs.productTableRef.initData();
  330. },
  331. handleTimeChange(key) {
  332. if (this.form.validityStartTime && this.form.validityEndTime) {
  333. if (this.form.validityStartTime > this.form.validityEndTime) {
  334. this.$message.error(
  335. `${key == 'validityStartTime' ? '开始' : '结束'}时间不能${
  336. key == 'validityStartTime' ? '大于' : '小于'
  337. }${key == 'validityStartTime' ? '结束' : '开始'}时间`
  338. );
  339. this.form[key] = '';
  340. }
  341. }
  342. },
  343. save() {
  344. this.$refs.form.validate((valid) => {
  345. if (!valid) {
  346. return false;
  347. }
  348. this.loading = true;
  349. // if (this.form.date?.length) {
  350. // this.form.validityStartTime = this.form.date[0];
  351. // this.form.validityEndTime = this.form.date[1];
  352. // }
  353. const data = {
  354. ...this.form
  355. };
  356. // delete data.date;
  357. let productTable = this.$refs.productTableRef.getTableValue();
  358. data.categorys = productTable || [];
  359. saveOrEdit(data)
  360. .then((msg) => {
  361. this.loading = false;
  362. this.$message.success(msg);
  363. this.dialogVisible = false;
  364. this.$emit('success');
  365. })
  366. .catch((e) => {
  367. this.loading = false;
  368. });
  369. });
  370. },
  371. //切换持证人类型
  372. holderTypeChange(e) {
  373. if (e === 2) {
  374. this.getCompanyData();
  375. }
  376. this.form.holder = '';
  377. this.form.holderId = '';
  378. this.form.type = '';
  379. },
  380. //查询公司分类
  381. async getCompanyData() {
  382. let list = await listOrganizations();
  383. list = list.filter((el) => el.type == 20);
  384. this.companyData = this.$util.toTreeData({
  385. data: list,
  386. idField: 'id',
  387. parentIdField: 'parentId'
  388. });
  389. },
  390. //选择公司分类
  391. handleChange(val) {
  392. if (!val) return (this.form.processTypeName = '');
  393. let node = this.$refs.tree.$refs.tree.getCurrentNode();
  394. this.form.holderId = node.id;
  395. this.form.holder = node.name;
  396. }
  397. }
  398. };
  399. </script>
  400. <style lang="scss">
  401. .el-form-item {
  402. margin-bottom: 20px !important;
  403. }
  404. </style>