checkModel.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. <template>
  2. <BasicModal
  3. v-bind="$attrs"
  4. @register="register"
  5. title="检测登记"
  6. width="700px"
  7. @cancel="clearInfo"
  8. :confirmLoading="loading"
  9. @ok="handleSubmit"
  10. >
  11. <div class="pt-2px pr-3px myRadioGroup">
  12. <BasicForm @register="registerForm">
  13. <template #text="{ model, field }">
  14. {{ model[field] }}
  15. </template>
  16. <template #add>
  17. <a-button type="primary" @click="add">添加备件</a-button>
  18. </template>
  19. <template #del="{ field }">
  20. <Button @click="del(field)">删除</Button>
  21. </template>
  22. </BasicForm>
  23. <div class="tips" style="padding: 0 100px">
  24. <p>说明</p>
  25. <p>1、保内维修,直接进入待备料或维修中</p>
  26. <p>2、保外维修,由售后人员进行报价确认后再备料维修</p>
  27. </div>
  28. </div>
  29. </BasicModal>
  30. </template>
  31. <script lang="ts">
  32. import { defineComponent, h, onMounted, reactive, ref } from 'vue';
  33. import { BasicModal, useModalInner } from '/@/components/Modal';
  34. import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
  35. import { useMessage } from '/@/hooks/web/useMessage';
  36. import { partAllList, faultAllList, checkRegister, checkRegisterInfo } from '/@/api/spares';
  37. import { useI18n } from '/@/hooks/web/useI18n';
  38. import { uploadApi } from '/@/api/product/index';
  39. import { treeItem, faultTree } from '/@/api/equity/index';
  40. const { t } = useI18n();
  41. export default defineComponent({
  42. components: { BasicModal, BasicForm },
  43. props: {
  44. userData: { type: Object },
  45. },
  46. emits: ['update', 'register'],
  47. setup(props, { emit }) {
  48. const n = ref(1);
  49. const fileFlow = reactive({
  50. file: null,
  51. cameraType: 0,
  52. type: 2, //2-普通发票,3-专用发票
  53. faultList: [],
  54. });
  55. const loading = ref(false);
  56. const { createMessage, createConfirm } = useMessage();
  57. let schemas: FormSchema[] = [
  58. {
  59. field: 'repairId',
  60. component: 'Input',
  61. label: '维修单号',
  62. slot: 'text',
  63. colProps: {
  64. span: 24,
  65. },
  66. },
  67. {
  68. field: 'deviceInfo',
  69. component: 'Input',
  70. label: '设备信息',
  71. slot: 'text',
  72. colProps: {
  73. span: 18,
  74. },
  75. },
  76. {
  77. field: 'warrantyExpirationDateText',
  78. component: 'Input',
  79. slot: 'text',
  80. label: '保修届满日期',
  81. },
  82. // {
  83. // field: 'faultIds',
  84. // component: 'ApiCascader',
  85. // required: true,
  86. // label: '故障类型',
  87. // componentProps: ({ formModel }) => {
  88. // return {
  89. // placeholder: '请选择维修物品',
  90. // api: async function () {
  91. // return await faultTree('V2');
  92. // },
  93. // labelField: 'faultMsg',
  94. // valueField: 'faultId',
  95. // immediate: true,
  96. // multiple: true,
  97. // isLeaf: (val) => {
  98. // return !val.children;
  99. // },
  100. // };
  101. // },
  102. // colProps: {
  103. // span: 12,
  104. // },
  105. // },
  106. // {
  107. // field: 'faultIds',
  108. // component: 'ApiCascader',
  109. // label: '故障类型',
  110. // required: true,
  111. // componentProps: ({ formModel }) => {
  112. // return {
  113. // placeholder: '请选择故障类型',
  114. // api: async function () {
  115. // // return await faultTree('V2');
  116. // return await treeItem('repair-item');
  117. // },
  118. // // labelField: 'faultMsg',
  119. // // valueField: 'faultId',
  120. // // fieldNames: {
  121. // // label: 'faultMsg',
  122. // // value: 'faultId',
  123. // // children: 'children',
  124. // // },
  125. // // immediate: true,
  126. // // multiple: true,
  127. // labelField: 'name',
  128. // valueField: 'id',
  129. // immediate: true,
  130. // multiple: true,
  131. // isLeaf: (val) => {
  132. // return !val.children;
  133. // },
  134. // };
  135. // },
  136. // colProps: {
  137. // span: 18,
  138. // },
  139. // },
  140. {
  141. field: 'defineDamage',
  142. component: 'RadioGroup',
  143. label: '定损结论',
  144. helpMessage: '保修期内人为损坏将转为保修外',
  145. defaultValue: 0,
  146. componentProps: {
  147. options: [
  148. {
  149. label: '非人为损坏',
  150. value: 0,
  151. },
  152. {
  153. label: '人为损坏',
  154. value: 1,
  155. },
  156. ],
  157. },
  158. colProps: {
  159. span: 22,
  160. },
  161. },
  162. {
  163. field: 'checkResult',
  164. component: 'InputTextArea',
  165. label: '检测结果',
  166. required: true,
  167. componentProps: {
  168. maxLength: 500,
  169. rows: 3,
  170. placeholder: '请描述检测后的具体故障情况。',
  171. },
  172. colProps: {
  173. span: 18,
  174. },
  175. },
  176. {
  177. field: 'checkImg',
  178. component: 'Upload',
  179. label: '相关图片',
  180. rules: [{ required: false, message: t('common.uploadMessge') }],
  181. itemProps: {
  182. validateTrigger: 'blur',
  183. },
  184. componentProps: {
  185. api: uploadApi,
  186. maxNumber: 6,
  187. maxSize: 1000,
  188. accept: ['jpeg', 'jpg', 'png'],
  189. },
  190. colProps: {
  191. span: 12,
  192. },
  193. },
  194. {
  195. field: '0',
  196. component: 'Input',
  197. label: '所需备件',
  198. colProps: {
  199. span: 18,
  200. },
  201. slot: 'add',
  202. },
  203. ];
  204. const [
  205. registerForm,
  206. {
  207. validate,
  208. resetFields,
  209. setFieldsValue,
  210. removeSchemaByFiled,
  211. appendSchemaByField,
  212. updateSchema,
  213. },
  214. ] = useForm({
  215. labelWidth: 100,
  216. schemas: schemas,
  217. showActionButtonGroup: false,
  218. actionColOptions: {
  219. span: 24,
  220. },
  221. });
  222. onMounted(() => {});
  223. // getFaultList();
  224. let addListFunc = () => {};
  225. const [register, { closeModal }] = useModalInner((data) => {
  226. data && onDataReceive(data);
  227. });
  228. async function getFaultList() {
  229. const res = await faultAllList({});
  230. fileFlow.faultList = res.map((item) => {
  231. return {
  232. ...item,
  233. label: item.faultMsg,
  234. value: item.faultId,
  235. };
  236. });
  237. }
  238. async function onDataReceive(data) {
  239. resetFields();
  240. let backfill = {
  241. faultIds: [],
  242. defineDamage: 0,
  243. checkResult: '',
  244. checkImg: [],
  245. };
  246. fileFlow.type = data.type;
  247. fileFlow.cameraType = data.cameraType;
  248. if (data.status == 20) {
  249. let res = await checkRegisterInfo({ repairId: data.repairId });
  250. console.log('repairId', res);
  251. let index = n.value;
  252. res.partList.map((ele, b) => {
  253. backfill[`partId${index + b}`] = ele.partId;
  254. backfill[`partCount${index + b}`] = ele.partCount;
  255. add();
  256. });
  257. backfill.faultIds = res.faultIds; //.map(ele => [ele]);
  258. backfill.defineDamage = res.defineDamage;
  259. backfill.checkResult = res.checkResult;
  260. backfill.checkImg = res.checkImg;
  261. }
  262. updateSchema([
  263. {
  264. field: 'faultIds',
  265. componentProps: {
  266. api: async function () {
  267. return await faultTree(data.faultVersion || 'V2');
  268. },
  269. labelField: 'faultMsg',
  270. valueField: 'faultId',
  271. immediate: true,
  272. multiple: true,
  273. isLeaf: (val) => {
  274. return !val.children;
  275. },
  276. },
  277. },
  278. {
  279. field: 'damage',
  280. ifShow: data.warrantyType == 0,
  281. },
  282. ]);
  283. setFieldsValue({
  284. ...data,
  285. ...backfill,
  286. warrantyExpirationDateText: `${data.warrantyDate || '无'}( ${t(
  287. 'routes.spares.warrantyType.' + data.warrantyType,
  288. )})`,
  289. deviceInfo: `${t('routes.scene.tableType.' + data.cameraType)} ${
  290. data.cameraSnCode || '无'
  291. }`,
  292. });
  293. }
  294. function del(field) {
  295. removeSchemaByFiled([`partId${field}`, `partCount${field}`, `${field}`]);
  296. // n.value--;
  297. }
  298. function add() {
  299. let list = addSchemas(n.value);
  300. list.map((ele) => {
  301. appendSchemaByField(ele, '');
  302. });
  303. n.value++;
  304. }
  305. function addSchemas(number) {
  306. let parentList: FormSchema[] = [
  307. {
  308. field: 'partId' + number,
  309. label: '备件',
  310. component: 'ApiSelect',
  311. colProps: {
  312. span: 12,
  313. },
  314. required: true,
  315. componentProps: {
  316. maxLength: 15,
  317. style: 'width: 220px',
  318. api: partAllList,
  319. labelField: 'partName',
  320. valueField: 'partId',
  321. params: {
  322. cameraType: fileFlow.cameraType,
  323. },
  324. showSearch: true,
  325. optionFilterProp: 'label',
  326. },
  327. },
  328. {
  329. field: 'partCount' + number,
  330. label: '数量',
  331. component: 'InputNumber',
  332. required: true,
  333. defaultValue: 1,
  334. labelWidth: 50,
  335. componentProps: {
  336. max: 999,
  337. min: 1,
  338. },
  339. colProps: {
  340. span: 6,
  341. },
  342. },
  343. {
  344. field: number.toString(),
  345. component: 'Input',
  346. label: '',
  347. labelWidth: 0,
  348. colProps: {
  349. span: 6,
  350. },
  351. slot: 'del',
  352. },
  353. ];
  354. return parentList;
  355. }
  356. function clearInfo(val) {
  357. if (!val) {
  358. resetFields();
  359. }
  360. let clearFiled = [];
  361. for (let index = 1; index < n.value; index++) {
  362. clearFiled.push(`partId${index}`, `partCount${index}`, `${index}`);
  363. }
  364. removeSchemaByFiled(clearFiled);
  365. n.value = 1;
  366. }
  367. const handleSubmit = async () => {
  368. loading.value = true;
  369. try {
  370. // createConfirm({
  371. // iconType: 'warning',
  372. // title: () => h('span', '温馨提示'),
  373. // content: '确定要提交检测报告吗?',
  374. // onOk: async () => {
  375. const params = await validate();
  376. let partList = [];
  377. for (let s = 1; s <= n.value; s++) {
  378. console.log('params', params, partList);
  379. if (params[`partId${s}`]) {
  380. partList.push({
  381. partId: params[`partId${s}`],
  382. partCount: params[`partCount${s}`],
  383. type: 0,
  384. });
  385. }
  386. }
  387. console.log('params', params, partList);
  388. await checkRegister({
  389. ...params,
  390. faultIds: (params.faultIds && params.faultIds.map((ele) => ele[ele.length - 1])) || [],
  391. partList,
  392. });
  393. clearInfo(false);
  394. loading.value = false;
  395. createMessage.success(t('common.optSuccess'));
  396. closeModal();
  397. emit('update');
  398. } catch (error) {
  399. loading.value = false;
  400. console.log('not passing', error);
  401. }
  402. };
  403. return {
  404. register,
  405. registerForm,
  406. fileFlow,
  407. handleSubmit,
  408. addListFunc,
  409. resetFields,
  410. loading,
  411. clearInfo,
  412. t,
  413. del,
  414. add,
  415. };
  416. },
  417. });
  418. </script>
  419. <style lang="less">
  420. .myRadioGroup {
  421. .ant-checkbox-group {
  422. overflow-y: auto;
  423. height: 90px;
  424. }
  425. }
  426. </style>