user-edit.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. <!-- 用户编辑弹窗 -->
  2. <template>
  3. <ele-modal
  4. width="960px"
  5. :visible="visible"
  6. :append-to-body="true"
  7. :close-on-click-modal="false"
  8. custom-class="ele-dialog-form"
  9. :title="isView ? '查看资质' : isUpdate ? '修改资质' : '添加资质'"
  10. @update:visible="updateVisible"
  11. :maxable="true"
  12. >
  13. <header-title title="基本信息"></header-title>
  14. <el-form ref="form" :model="form" :rules="rules" label-width="100px">
  15. <el-row>
  16. <el-col :span="10">
  17. <el-form-item label="资质类型:" prop="certificationType">
  18. <el-select
  19. style="width: 100%"
  20. :disabled="isView"
  21. v-model="form.certificationType"
  22. @change="changeCertificationType"
  23. filterable
  24. >
  25. <el-option
  26. v-for="item in qualificationOptions"
  27. :key="item.value"
  28. :label="item.label"
  29. :value="item.value"
  30. >
  31. </el-option>
  32. </el-select>
  33. </el-form-item>
  34. </el-col>
  35. <el-col :span="10">
  36. <el-form-item label="编码:" prop="code">
  37. <el-input
  38. :disabled="isView"
  39. v-model="form.code"
  40. clearable
  41. placeholder="请输入"
  42. />
  43. </el-form-item>
  44. </el-col>
  45. </el-row>
  46. <el-row>
  47. <el-col :span="10">
  48. <el-form-item label="类型:" prop="type">
  49. <el-select
  50. style="width: 100%"
  51. :disabled="isView"
  52. v-model="form.type"
  53. filterable
  54. >
  55. <el-option
  56. v-for="item in typeList"
  57. :key="item.dictCode"
  58. :label="item.dictValue"
  59. :value="item.dictCode"
  60. >
  61. </el-option>
  62. </el-select>
  63. </el-form-item>
  64. </el-col>
  65. <el-col :span="10">
  66. <el-form-item label="等级:" prop="level">
  67. <el-select
  68. style="width: 100%"
  69. :disabled="isView"
  70. v-model="form.level"
  71. filterable
  72. >
  73. <el-option
  74. :label="item.label"
  75. :value="item.value"
  76. v-for="(item, index) in levelOptions"
  77. :key="index"
  78. >
  79. </el-option>
  80. </el-select>
  81. </el-form-item>
  82. </el-col>
  83. </el-row>
  84. <el-row>
  85. <el-col :span="20">
  86. <el-form-item label="名称:" prop="name">
  87. <el-input
  88. :disabled="isView"
  89. v-model="form.name"
  90. readonly
  91. clearable
  92. @click.native="handleClick"
  93. placeholder="请选择"
  94. />
  95. </el-form-item>
  96. </el-col>
  97. </el-row>
  98. <el-row>
  99. <el-col :span="20">
  100. <el-form-item label="附件:" prop="accessory">
  101. <fileUpload
  102. v-if="!isView"
  103. v-model="filedList"
  104. :show-file-list="false"
  105. module="main"
  106. @input="uploadedSuccess($event, form)"
  107. :limit="1"
  108. />
  109. <div v-if="form.accessory?.storePath">
  110. <span>{{ form.accessory.name }}</span>
  111. <el-button
  112. style="margin-left: 10px"
  113. size="mini"
  114. type="primary"
  115. @click="downloadFile(form.accessory.storePath, form)"
  116. >下载</el-button
  117. >
  118. </div>
  119. </el-form-item>
  120. </el-col>
  121. </el-row>
  122. <el-row>
  123. <el-col :span="20">
  124. <el-form-item label="有效时间:" prop="date">
  125. <el-date-picker
  126. :disabled="isView"
  127. v-model="form.date"
  128. type="daterange"
  129. value-format="yyyy-MM-dd HH:mm:ss"
  130. range-separator="至"
  131. start-placeholder="开始日期"
  132. end-placeholder="结束日期"
  133. >
  134. </el-date-picker>
  135. </el-form-item>
  136. </el-col>
  137. </el-row>
  138. </el-form>
  139. <vendorDialog
  140. ref="vendorDialogRef"
  141. @success="confirmSelection"
  142. ></vendorDialog>
  143. <staffSelection
  144. ref="staffSelection"
  145. @confirm="confirmSelection"
  146. ></staffSelection>
  147. <clientDialog
  148. ref="clientSelection"
  149. @success="confirmSelection"
  150. ></clientDialog>
  151. <template v-slot:footer>
  152. <el-button @click="updateVisible(false)">取消</el-button>
  153. <el-button v-if="isView" type="primary" @click="updateVisible(false)">
  154. 确定
  155. </el-button>
  156. <el-button v-else type="primary" :loading="loading" @click="save">
  157. 保存
  158. </el-button>
  159. </template>
  160. </ele-modal>
  161. </template>
  162. <script>
  163. import clientDialog from './clientDialog.vue';
  164. import vendorDialog from './vendorDialog.vue';
  165. import staffSelection from './staffSelection.vue';
  166. import fileUpload from '@/components/upload/fileUpload';
  167. import { getFile } from '@/api/system/file';
  168. import {
  169. saveProfessionCertification,
  170. getProfessionCertificationById,
  171. updateProfessionCertificationById
  172. } from '@/api/factoryModel';
  173. export default {
  174. components: {
  175. fileUpload,
  176. vendorDialog,
  177. staffSelection,
  178. clientDialog
  179. },
  180. props: {
  181. // 弹窗是否打开
  182. visible: Boolean,
  183. // 修改回显的数据
  184. data: Object,
  185. isView: Boolean,
  186. controlList: Array,
  187. typeList: Array
  188. },
  189. data() {
  190. const defaultForm = function () {
  191. return {
  192. id: '',
  193. certificationType: '',
  194. code: '',
  195. personnelIds: '',
  196. level: '',
  197. name: '',
  198. type: '',
  199. status: 0,
  200. accessory: {},
  201. date: '小时'
  202. };
  203. };
  204. return {
  205. qualificationOptions: [
  206. {
  207. label: '客户资质',
  208. value: '1'
  209. },
  210. {
  211. label: '供应商资质',
  212. value: '2'
  213. },
  214. {
  215. label: '个人资质',
  216. value: '3'
  217. }
  218. ],
  219. filedList: [],
  220. defaultForm,
  221. // 表单数据
  222. form: defaultForm(),
  223. moneyOptions: [
  224. {
  225. label: '元',
  226. value: '元'
  227. }
  228. ],
  229. timeOptions: [
  230. {
  231. label: '小时',
  232. value: '小时'
  233. },
  234. {
  235. label: '天',
  236. value: '天'
  237. },
  238. {
  239. label: '月',
  240. value: '月'
  241. }
  242. ],
  243. levelOptions: [
  244. {
  245. label: '初级',
  246. value: '1'
  247. },
  248. {
  249. label: '中级',
  250. value: '2'
  251. },
  252. {
  253. label: '高级',
  254. value: '3'
  255. }
  256. ],
  257. // 表单验证规则
  258. rules: {
  259. name: [{ required: true, message: '请输入名称', trigger: 'change' }],
  260. code: [{ required: true, trigger: 'blur', message: '请输入编码' }],
  261. date: [{ required: true, message: '请选择资质', trigger: 'change' }],
  262. type: [{ required: true, message: '请选择类型', trigger: 'change' }]
  263. },
  264. // 提交状态
  265. loading: false,
  266. // 是否是修改
  267. isUpdate: false,
  268. chooseItem: null
  269. };
  270. },
  271. methods: {
  272. changeCertificationType(value) {
  273. this.form.certificationType = value;
  274. this.form.name = '';
  275. this.form.personnelIds = '';
  276. },
  277. handleClick() {
  278. switch (this.form.certificationType) {
  279. case '1':
  280. this.$refs.clientSelection.open();
  281. break;
  282. case '2':
  283. this.$refs.vendorDialogRef.open();
  284. break;
  285. case '3':
  286. this.$refs.staffSelection.open([]);
  287. break;
  288. }
  289. },
  290. confirmSelection(data) {
  291. console.log(data);
  292. this.form.personnelIds = data.map((item) => item.id).join(',');
  293. this.form.name = data.map((item) => item.name).join(',');
  294. this.$forceUpdate();
  295. },
  296. downloadFile(url, form) {
  297. console.log(form);
  298. getFile({ objectName: url }, '附件');
  299. },
  300. uploadedSuccess(data, row) {
  301. console.log(data, row);
  302. row.accessory.storePath = data[0].storePath;
  303. row.accessory.name = data[0].name;
  304. this.filedList = [];
  305. },
  306. /* 保存编辑 */
  307. save() {
  308. this.$refs.form.validate((valid) => {
  309. if (!valid) {
  310. return false;
  311. }
  312. console.log(this.form);
  313. if (!this.isUpdate) {
  314. delete this.form.id;
  315. }
  316. this.form.startTime = this.form.date[0];
  317. this.form.endTime = this.form.date[1];
  318. this.loading = true;
  319. let apiStr = null;
  320. if (this.isUpdate) {
  321. apiStr = updateProfessionCertificationById;
  322. } else {
  323. apiStr = saveProfessionCertification;
  324. }
  325. apiStr(this.form)
  326. .then((msg) => {
  327. this.loading = false;
  328. this.$message.success((this.isUpdate ? '修改' : '新建') + '成功');
  329. this.updateVisible(false);
  330. this.$emit('done');
  331. })
  332. .catch((e) => {
  333. this.loading = false;
  334. // this.$message.error(e.message);
  335. });
  336. });
  337. },
  338. /* 更新visible */
  339. updateVisible(value) {
  340. this.form = { ...this.defaultForm() };
  341. this.$emit('update:visible', value);
  342. }
  343. },
  344. watch: {
  345. async visible(visible) {
  346. if (visible) {
  347. if (this.data) {
  348. const res = await getProfessionCertificationById(this.data.id);
  349. console.log(res);
  350. this.$util.assignObject(this.form, {
  351. ...res
  352. });
  353. this.form.date = [res.startTime, res.endTime];
  354. this.isUpdate = true;
  355. console.log(this.form);
  356. } else {
  357. this.filedList = [];
  358. this.form = { ...this.defaultForm() };
  359. this.isUpdate = false;
  360. }
  361. } else {
  362. this.$refs.form.clearValidate();
  363. this.form = { ...this.defaultForm() };
  364. }
  365. }
  366. }
  367. };
  368. </script>
  369. <style lang="scss" scoped>
  370. .hourCostStyle {
  371. display: flex;
  372. > div {
  373. margin-right: 10px;
  374. }
  375. > div:last-child {
  376. margin-right: 0;
  377. }
  378. }
  379. </style>