add-dialog.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  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="date" label="有效期至">
  106. <el-date-picker
  107. style="width: 100%"
  108. v-model="form.date"
  109. type="daterange"
  110. range-separator="至"
  111. start-placeholder="开始日期"
  112. end-placeholder="结束日期"
  113. value-format="yyyy-MM-dd HH:mm:ss"
  114. :default-time="['00:00:00', '23:59:59']"
  115. >
  116. </el-date-picker>
  117. </el-form-item>
  118. </el-col>
  119. <el-col v-bind="styleResponsive ? { sm: 24 } : { span: 24 }">
  120. <el-form-item prop="fileObj" label="附件">
  121. <fileMain v-model="form.fileObj" />
  122. </el-form-item>
  123. </el-col>
  124. <el-col v-bind="styleResponsive ? { sm: 24 } : { span: 24 }">
  125. <el-form-item prop="remark" label="备注">
  126. <el-input
  127. placeholder="请输入"
  128. v-model="form.remark"
  129. type="textarea"
  130. :rows="3"
  131. :resize="`none`"
  132. ></el-input>
  133. </el-form-item>
  134. </el-col>
  135. </el-row>
  136. </el-form>
  137. <staffSelection
  138. ref="staffSelection"
  139. @confirm="confirmStaffSelection"
  140. ></staffSelection>
  141. <productTable ref="productTableRef" />
  142. <supplierSelection
  143. ref="supplierSelectionRef"
  144. @confirm="confirmStaffSelection"
  145. />
  146. <customerSelection
  147. ref="customerSelectionRef"
  148. @confirm="confirmStaffSelection"
  149. />
  150. <div slot="footer" class="dialog-footer">
  151. <el-button size="small" @click="save" type="primary">保 存</el-button>
  152. <el-button size="small" @click="close">关 闭</el-button>
  153. </div>
  154. </ele-modal>
  155. </template>
  156. <script>
  157. import staffSelection from './staffSelection.vue';
  158. import { saveOrEdit, getPhotoInfo } from '@/api/documentManagement';
  159. // import fileMain from '@/components/addDoc/index.vue';
  160. import { getCode } from '@/api/ruleManagement/matter';
  161. import productTable from './productTable.vue';
  162. import supplierSelection from './supplierSelection.vue';
  163. import customerSelection from './customerSelection.vue';
  164. import { listOrganizations } from '@/api/system/organization';
  165. import { holderTypeOptions } from '@/enum/dict.js';
  166. const defaultForm = {
  167. code: '',
  168. holder: '',
  169. holderId: '',
  170. type: '',
  171. date: [],
  172. fileObj: [],
  173. holderType: '4',
  174. status: 1
  175. };
  176. export default {
  177. components: {
  178. staffSelection,
  179. productTable,
  180. supplierSelection,
  181. customerSelection,
  182. // fileMain
  183. },
  184. //注册组件
  185. data() {
  186. return {
  187. dialogVisible: false,
  188. levelOptions: [
  189. {
  190. label: '初级',
  191. value: '1'
  192. },
  193. {
  194. label: '中级',
  195. value: '2'
  196. },
  197. {
  198. label: '高级',
  199. value: '3'
  200. }
  201. ],
  202. rules: {
  203. code: [
  204. { required: true, trigger: 'blur', message: '请输入证照编号' }
  205. ],
  206. // level: [{ required: true, trigger: 'change', message: '选择等级' }],
  207. type: [
  208. { required: true, trigger: 'change', message: '请选择证件类型' }
  209. ],
  210. date: [
  211. { required: true, trigger: 'change', message: '请选择有效期' }
  212. ],
  213. holder: [
  214. { required: true, trigger: 'change', message: '请选择持证对象' }
  215. ],
  216. status: [
  217. { required: true, trigger: 'change', message: '请选择状态' }
  218. ],
  219. fileObj: [{ required: true, trigger: 'change', message: '请选择' }]
  220. },
  221. form: { ...defaultForm },
  222. title: '新增',
  223. holderTypeOptions,
  224. companyData: [] //公司分类
  225. };
  226. },
  227. computed: {
  228. // 是否开启响应式布局
  229. styleResponsive() {
  230. return this.$store.state.theme.styleResponsive;
  231. }
  232. },
  233. created() {
  234. this.getCompanyData();
  235. },
  236. methods: {
  237. //选择负责人
  238. confirmStaffSelection(data) {
  239. console.log(data);
  240. this.form.holderId = data.map((item) => item.id).join(',');
  241. this.form.holder = data.map((item) => item.name).join(',');
  242. this.$forceUpdate();
  243. console.log(this.form);
  244. },
  245. openStaffSelection() {
  246. if (this.form.holderType == 1) {
  247. this.$refs.staffSelection.open([]);
  248. } else if (this.form.holderType == 3 || this.form.holderType == 6) {
  249. this.$refs.supplierSelectionRef.open([]);
  250. } else if (this.form.holderType == 4) {
  251. this.$refs.customerSelectionRef.open([]);
  252. }
  253. },
  254. open(row) {
  255. this.$refs.form && this.$refs.form.clearValidate();
  256. this.dialogVisible = true;
  257. if (row) {
  258. this.title = '修改';
  259. this.getInfo(row.id);
  260. } else {
  261. this.title = '新增';
  262. }
  263. },
  264. async getOrderCode() {
  265. const data = await getCode('license_code');
  266. this.$set(this.form, 'code', data);
  267. },
  268. async getInfo(id) {
  269. const data = await getPhotoInfo(id);
  270. this.form = {
  271. ...data,
  272. type: data.type + '',
  273. date: [data.validityStartTime, data.validityEndTime],
  274. holderType: data.holderType || '1'
  275. };
  276. this.$refs.productTableRef.putTableValue(data.categorys || []);
  277. },
  278. close() {
  279. this.dialogVisible = false;
  280. // this.$refs.form.resetFields()
  281. this.form = { defaultForm };
  282. this.$refs.productTableRef.initData();
  283. },
  284. save() {
  285. this.$refs.form.validate((valid) => {
  286. if (!valid) {
  287. return false;
  288. }
  289. this.loading = true;
  290. if (this.form.date?.length) {
  291. this.form.validityStartTime = this.form.date[0];
  292. this.form.validityEndTime = this.form.date[1];
  293. }
  294. const data = {
  295. ...this.form
  296. };
  297. delete data.date;
  298. let productTable = this.$refs.productTableRef.getTableValue();
  299. data.categorys = productTable || [];
  300. saveOrEdit(data)
  301. .then((msg) => {
  302. this.loading = false;
  303. this.$message.success(msg);
  304. this.dialogVisible = false;
  305. this.$emit('success');
  306. })
  307. .catch((e) => {
  308. this.loading = false;
  309. });
  310. });
  311. },
  312. //切换持证人类型
  313. holderTypeChange(e) {
  314. if (e === 2) {
  315. this.getCompanyData();
  316. }
  317. this.form.holder = '';
  318. this.form.holderId = '';
  319. this.form.type = '';
  320. },
  321. //查询公司分类
  322. async getCompanyData() {
  323. let list = await listOrganizations();
  324. list = list.filter((el) => el.type == 20);
  325. this.companyData = this.$util.toTreeData({
  326. data: list,
  327. idField: 'id',
  328. parentIdField: 'parentId'
  329. });
  330. },
  331. //选择公司分类
  332. handleChange(val) {
  333. if (!val) return (this.form.processTypeName = '');
  334. let node = this.$refs.tree.$refs.tree.getCurrentNode();
  335. this.form.holderId = node.id;
  336. }
  337. }
  338. };
  339. </script>
  340. <style lang="scss">
  341. .el-form-item {
  342. margin-bottom: 20px !important;
  343. }
  344. </style>