Browse Source

fix: xiugai

tangning 2 years ago
parent
commit
02904bea25

+ 444 - 398
src/api/spares/index.ts

@@ -5,420 +5,466 @@ import { detailResult } from './model';
 const { t } = useI18n();
 
 enum Api {
-  saleOrderList = '/service/sale/salePersonnel/saleOrderList',//工单列表
-  orderReceiving = '/service/sale/salePersonnel/orderReceiving',//工单接单
-  getByRoleType = '/service/sale/sysUser/getByRoleType',//根据角色类型获取用户列表
-  updateRemark = '/service/sale/salePersonnel/updateRemark',//单修改备注
-  recording = '/service/sale/salePersonnel/recording',//系统录单
-  allList = '/service/sale/laborCost/allList',//人工费用全部列表
-  getPriceList = '/service/sale/salePersonnel/getPriceList',//根据工单号获取报价单
-  addOrUpdatePriceList = '/service/sale/salePersonnel/addOrUpdatePriceList',//添加或修改报价单
-  confirmRepair = '/service/sale/salePersonnel/confirmRepair',//确认维修
-  payRegister = '/service/sale/salePersonnel/payRegister',//付款登记
-  sendRegister = '/service/sale/salePersonnel/sendRegister',//发货登记
-  supplyOrderList = '/service/sale/supplyPersonnel/supplyOrderList',//维修备件管理 供应链 列表
-  partRecovery = '/service/sale/supplyPersonnel/partRecovery',//备件回收
-  partOut = '/service/sale/supplyPersonnel/partOut',//备件出库
-  repairOrderList = '/service/sale/repairPersonnel/repairOrderList',//工单列表
-  detail = '/service/sale/repairInfo/details',//工单详情
-  process = '/service/sale/repairInfo/process',//工单流程
-  partList = '/service/sale/part/list',//备件列表
-  faultAllList = '/service/sale/fault/allList',//故障列表
-  checkRegisterInfo = '/service/sale/repairPersonnel/checkRegisterInfo',//维修登记,维修完成回显详情
-  checkRegister = '/service/sale/repairPersonnel/checkRegister',//维修登记
-  partAllList = '/service/sale/part/allList',//全部备件列表没分页
-  partAddOrUpdate = '/service/sale/part/addOrUpdate',//新增设备,修改设备,修改状态
-  partInStock = '/service/sale/part/inStock',//添加库存,入库
-  repairAddPart = '/service/sale/repairPersonnel/repairAddPart',//维修中添加备件
-  repairOver = '/service/sale/repairPersonnel/repairOver',//维修完成
-  partInStockLog = '/service/sale/part/inStockLog',//添加库存,入库 日志列表
-  partInfoList = '/service/sale/supplyPersonnel/partInfo',//备件入库
-  repairTesterList = '/service/sale/repairTest/repairTesterList',//测试列表
-  testPassOrFail = '/service/sale/repairTest/testPassOrFail',//测试列表
-  queryList = '/service/sale/repairInfo/list',//工单查询
-  export = '/service/sale/repairPay/export',//导出列表
-  repairPayList = '/service/sale/repairPay/list',//售后列表
-  exportExcel = '/service/sale/repairInfo/exportExcel'
+  saleOrderList = '/service/sale/salePersonnel/saleOrderList', //工单列表
+  orderReceiving = '/service/sale/salePersonnel/orderReceiving', //工单接单
+  getByRoleType = '/service/sale/sysUser/getByRoleType', //根据角色类型获取用户列表
+  updateRemark = '/service/sale/salePersonnel/updateRemark', //单修改备注
+  recording = '/service/sale/salePersonnel/recording', //系统录单
+  allList = '/service/sale/laborCost/allList', //人工费用全部列表
+  getPriceList = '/service/sale/salePersonnel/getPriceList', //根据工单号获取报价单
+  addOrUpdatePriceList = '/service/sale/salePersonnel/addOrUpdatePriceList', //添加或修改报价单
+  confirmRepair = '/service/sale/salePersonnel/confirmRepair', //确认维修
+  payRegister = '/service/sale/salePersonnel/payRegister', //付款登记
+  sendRegister = '/service/sale/salePersonnel/sendRegister', //发货登记
+  supplyOrderList = '/service/sale/supplyPersonnel/supplyOrderList', //维修备件管理 供应链 列表
+  partRecovery = '/service/sale/supplyPersonnel/partRecovery', //备件回收
+  partOut = '/service/sale/supplyPersonnel/partOut', //备件出库
+  repairOrderList = '/service/sale/repairPersonnel/repairOrderList', //工单列表
+  detail = '/service/sale/repairInfo/details', //工单详情
+  process = '/service/sale/repairInfo/process', //工单流程
+  partList = '/service/sale/part/list', //备件列表
+  faultAllList = '/service/sale/fault/allList', //故障列表
+  checkRegisterInfo = '/service/sale/repairPersonnel/checkRegisterInfo', //维修登记,维修完成回显详情
+  checkRegister = '/service/sale/repairPersonnel/checkRegister', //维修登记
+  partAllList = '/service/sale/part/allList', //全部备件列表没分页
+  partAddOrUpdate = '/service/sale/part/addOrUpdate', //新增设备,修改设备,修改状态
+  partInStock = '/service/sale/part/inStock', //添加库存,入库
+  repairAddPart = '/service/sale/repairPersonnel/repairAddPart', //维修中添加备件
+  repairOver = '/service/sale/repairPersonnel/repairOver', //维修完成
+  partInStockLog = '/service/sale/part/inStockLog', //添加库存,入库 日志列表
+  partInfoList = '/service/sale/supplyPersonnel/partInfo', //备件入库
+  repairTesterList = '/service/sale/repairTest/repairTesterList', //测试列表
+  testPassOrFail = '/service/sale/repairTest/testPassOrFail', //测试列表
+  queryList = '/service/sale/repairInfo/list', //工单查询
+  export = '/service/sale/repairPay/export', //导出列表
+  repairPayList = '/service/sale/repairPay/list', //售后列表
+  exportExcel = '/service/sale/repairInfo/exportExcel',
+  checkAccountList = '/service/sale/repairCheckAccount/checkAccountList',
+  checkAccount = '/service/sale/repairCheckAccount/checkAccount',
+  u8ListList = '/service/sale/repairU8/u8List',
+  u8Send = '/service/sale/repairU8/u8Send',
 }
 
 /**
  * @description: Get sample list value
  */
 
- interface logDataResule {
+interface logDataResule {
   lastDownNum: number;
   lastHighNum: number;
   lastMajorNum: number;
 }
- export const saleOrderList = (params) =>
- defHttp.post<logDataResule>({
-   url: Api.saleOrderList,
-   params: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
-
- export const detail = (params) =>
- defHttp.get<detailResult>({
-   url: Api.detail,
-   params: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
-
- export const process = (params) =>
- defHttp.get<Result>({
-   url: Api.process,
-   params: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
- 
- export const orderReceiving = (params) =>
- defHttp.post<Result>({
-   url: Api.orderReceiving,
-   params: params,
-   // data: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
-
- export const getByRoleType = (params) =>
- defHttp.get<Result>({
-   url: Api.getByRoleType,
-   params: params,
-   // data: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
- 
- export const recording = (params) =>
- defHttp.post<Result>({
-   url: Api.recording,
-   params: params,
-   // data: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
-
- export const exportFile = (params) =>
- defHttp.get<Result>({
-   url: Api.export,
-   params: params,
-   // data: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
-
- export const repairPayList = (params) =>
- defHttp.post<Result>({
-   url: Api.repairPayList,
-   params: params,
-   // data: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
-
- export const updateRemark = (params) =>
- defHttp.post<Result>({
-   url: Api.updateRemark,
-   params: params,
-   // data: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
-
- export const queryList = (params) =>
- defHttp.post<Result>({
-   url: Api.queryList,
-   params: params,
-   // data: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
-
- export const allList = (params) =>
- defHttp.get<Result>({
-   url: Api.allList,
-   params: params,
-   // data: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
-
- export const getPriceList = (params) =>
- defHttp.get<Result>({
-   url: Api.getPriceList,
-   params: params,
-   // data: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
-
-
- export const addOrUpdatePriceList = (params) =>
- defHttp.post<Result>({
-   url: Api.addOrUpdatePriceList,
-   params: params,
-   // data: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
-
- export const confirmRepair = (params) =>
- defHttp.post<Result>({
-   url: Api.confirmRepair,
-   params: params,
-   // data: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
-
- export const payRegister = (params) =>
- defHttp.post<Result>({
-   url: Api.payRegister,
-   params: params,
-   // data: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
-
-
- export const sendRegister = (params) =>
- defHttp.post<Result>({
-   url: Api.sendRegister,
-   params: params,
-   // data: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
- export const supplyOrderList = (params) =>
- defHttp.post<Result>({
-   url: Api.supplyOrderList,
-   params: params,
-   // data: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
- 
- export const partInfo = (params) =>
- defHttp.get<Result>({
-   url: Api.partInfoList,
-   params: params,
-   // data: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
- 
- export const partRecovery = (params) =>
- defHttp.post<Result>({
-   url: Api.partRecovery,
-   params: params,
-   // data: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
-
- export const partOut = (params) =>
- defHttp.post<Result>({
-   url: Api.partOut,
-   params: params,
-   // data: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
- export const repairOrderList = (params) =>
- defHttp.post<logDataResule>({
-   url: Api.repairOrderList,
-   params: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
-
- export const partList = (params) =>
- defHttp.post<detailResult>({
-   url: Api.partList,
-   params: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
- 
- export const partAllList = (params) =>
- defHttp.post<detailResult>({
-   url: Api.partAllList,
-   params: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
-
- export const checkRegister = (params) =>
- defHttp.post<detailResult>({
-   url: Api.checkRegister,
-   params: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
-
- export const checkRegisterInfo = (params) =>
- defHttp.get<detailResult>({
-   url: Api.checkRegisterInfo,
-   params: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
-
- export const faultAllList = (params) =>
- defHttp.get<detailResult>({
-   url: Api.faultAllList,
-   params: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
-
- export const partAddOrUpdate = (params) =>
- defHttp.post<detailResult>({
-   url: Api.partAddOrUpdate,
-   params: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- }); 
-
- export const partInStock = (params) =>
- defHttp.post<detailResult>({
-   url: Api.partInStock,
-   params: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
-
- export const repairOver = (params) =>
- defHttp.post<detailResult>({
-   url: Api.repairOver,
-   params: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
-
- export const partInStockLog = (params) =>
- defHttp.post<detailResult>({
-   url: Api.partInStockLog,
-   params: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
-
- export const repairAddPart = (params) =>
- defHttp.post<detailResult>({
-   url: Api.repairAddPart,
-   params: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
-
- export const testPassOrFail = (params) =>
- defHttp.post<detailResult>({
-   url: Api.testPassOrFail,
-   params: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
- 
- export const repairTesterList = (params) =>
- defHttp.post<detailResult>({
-   url: Api.repairTesterList,
-   params: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
- export const DownExport = (params) =>
+export const saleOrderList = (params) =>
+  defHttp.post<logDataResule>({
+    url: Api.saleOrderList,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const detail = (params) =>
+  defHttp.get<detailResult>({
+    url: Api.detail,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const process = (params) =>
+  defHttp.get<Result>({
+    url: Api.process,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const orderReceiving = (params) =>
+  defHttp.post<Result>({
+    url: Api.orderReceiving,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const getByRoleType = (params) =>
+  defHttp.get<Result>({
+    url: Api.getByRoleType,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const recording = (params) =>
+  defHttp.post<Result>({
+    url: Api.recording,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const exportFile = (params) =>
+  defHttp.get<Result>({
+    url: Api.export,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const repairPayList = (params) =>
+  defHttp.post<Result>({
+    url: Api.repairPayList,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const updateRemark = (params) =>
+  defHttp.post<Result>({
+    url: Api.updateRemark,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const queryList = (params) =>
+  defHttp.post<Result>({
+    url: Api.queryList,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const allList = (params) =>
+  defHttp.get<Result>({
+    url: Api.allList,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const getPriceList = (params) =>
+  defHttp.get<Result>({
+    url: Api.getPriceList,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const addOrUpdatePriceList = (params) =>
+  defHttp.post<Result>({
+    url: Api.addOrUpdatePriceList,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const confirmRepair = (params) =>
+  defHttp.post<Result>({
+    url: Api.confirmRepair,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const payRegister = (params) =>
+  defHttp.post<Result>({
+    url: Api.payRegister,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const sendRegister = (params) =>
+  defHttp.post<Result>({
+    url: Api.sendRegister,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const supplyOrderList = (params) =>
+  defHttp.post<Result>({
+    url: Api.supplyOrderList,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const checkAccountList = (params) =>
+  defHttp.post<Result>({
+    url: Api.checkAccountList,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const u8ListList = (params) =>
+  defHttp.post<Result>({
+    url: Api.u8ListList,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const u8Send = (params) =>
+  defHttp.post<Result>({
+    url: Api.u8Send,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const checkAccount = (params) =>
+  defHttp.post<Result>({
+    url: Api.checkAccount,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const partInfo = (params) =>
+  defHttp.get<Result>({
+    url: Api.partInfoList,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const partRecovery = (params) =>
+  defHttp.post<Result>({
+    url: Api.partRecovery,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const partOut = (params) =>
+  defHttp.post<Result>({
+    url: Api.partOut,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const repairOrderList = (params) =>
+  defHttp.post<logDataResule>({
+    url: Api.repairOrderList,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const partList = (params) =>
+  defHttp.post<detailResult>({
+    url: Api.partList,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const partAllList = (params) =>
+  defHttp.post<detailResult>({
+    url: Api.partAllList,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const checkRegister = (params) =>
+  defHttp.post<detailResult>({
+    url: Api.checkRegister,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const checkRegisterInfo = (params) =>
+  defHttp.get<detailResult>({
+    url: Api.checkRegisterInfo,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const faultAllList = (params) =>
+  defHttp.get<detailResult>({
+    url: Api.faultAllList,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const partAddOrUpdate = (params) =>
+  defHttp.post<detailResult>({
+    url: Api.partAddOrUpdate,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const partInStock = (params) =>
+  defHttp.post<detailResult>({
+    url: Api.partInStock,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const repairOver = (params) =>
+  defHttp.post<detailResult>({
+    url: Api.repairOver,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const partInStockLog = (params) =>
+  defHttp.post<detailResult>({
+    url: Api.partInStockLog,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const repairAddPart = (params) =>
+  defHttp.post<detailResult>({
+    url: Api.repairAddPart,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const testPassOrFail = (params) =>
+  defHttp.post<detailResult>({
+    url: Api.testPassOrFail,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const repairTesterList = (params) =>
+  defHttp.post<detailResult>({
+    url: Api.repairTesterList,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const DownExport = (params) =>
   defHttp.downloadFile<FileStream>({
-    url: Api.export,// + `?lang=${params.lang}`,
+    url: Api.export, // + `?lang=${params.lang}`,
     params: params,
-    fileName:'售后订单列表.xlsx',
+    fileName: '售后订单列表.xlsx',
     // data: params,
     headers: {
       // @ts-ignore
       ignoreCancelToken: true,
     },
-    responseType: 'blob'
+    responseType: 'blob',
   });
 
-  export const detailDownExport = (params) =>{
-    return  defHttp.downloadFile<FileStream>({
-      url: Api.exportExcel+`?repairId=${params.repairId}&type=${params.type}`,
-      params: params,
-      fileName:params.name+'.pdf',
-      // data: params,
-      headers: {
-        // @ts-ignore
-        ignoreCancelToken: true,
-      },
-      responseType: 'blob'
-    });
-  }
+export const detailDownExport = (params) => {
+  return defHttp.downloadFile<FileStream>({
+    url: Api.exportExcel + `?repairId=${params.repairId}&type=${params.type}`,
+    params: params,
+    fileName: params.name + '.pdf',
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+    responseType: 'blob',
+  });
+};

+ 2 - 0
src/locales/lang/zh-CN/routes/spares.ts

@@ -6,10 +6,12 @@ export default {
     20: '待报价',
     30: '待确认',
     40: '已取消',
+    41: 'u8发货',
     50: '待备料',
     60: '维修中',
     70: '待测试',
     80: '待支付',
+    82: '待支付到账',
     90: '待回收',
     91: '待回收',
     100: '待发货',

+ 201 - 0
src/views/Accounting/ListModal.vue

@@ -0,0 +1,201 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    :title="fileFlow.title"
+    width="700px"
+    okText="确认到账"
+    @cancel="resetFields"
+    :confirmLoading="loading"
+    @ok="handleSubmit"
+  >
+    <div class="pt-2px pr-3px">
+      <BasicForm @register="registerForm">
+        <template #text="{ model, field }">
+          {{ model[field] }}
+        </template>
+        <template #img="{ model }">
+          <PreviewGroup>
+            <Image style="overflow: hidden;height: 100%;object-fit: cover;" :height="80" :width="80" v-for="item in model.payImgArray" :key="item" :src="item" :size="200" />
+          </PreviewGroup>
+        </template>
+      </BasicForm>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, h, onMounted, reactive, ref } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { Image } from 'ant-design-vue';
+  import {
+    partAllList,
+    faultAllList,
+    checkRegister,
+    partInfo,
+    partInfo,
+    checkRegisterInfo,
+    checkAccount,
+  } from '/@/api/spares';
+  import { TableImg } from '/@/components/Table';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { uploadApi } from '/@/api/product/index';
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm, Image, PreviewGroup: Image.PreviewGroup, },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['update', 'register'],
+    setup(props, { emit }) {
+      const n = ref(1);
+      const repairId = ref('');
+      const fileFlow = reactive({
+        file: null,
+        title: '发件登记',
+        repairId: null,
+        cameraType: 0,
+        type: 2, //2-普通发票,3-专用发票
+        faultList: [],
+      });
+      const loading = ref(false);
+      const { createMessage, createConfirm } = useMessage();
+      let schemas: FormSchema[] = [
+        {
+          field: 'repairId',
+          component: 'Input',
+          label: '维修单号',
+          slot: 'text',
+          colProps: {
+            span: 24,
+          },
+        },
+        {
+          field: 'deviceInfo',
+          component: 'Input',
+          label: '设备信息',
+          slot: 'text',
+          colProps: {
+            span: 18,
+          },
+        },
+        {
+          field: 'payAmount',
+          component: 'Input',
+          label: '应收金额',
+          slot: 'text',
+          colProps: {
+            span: 24,
+          },
+        },
+        {
+          field: 'payImgArray',
+          component: 'Input',
+          label: '付款凭证',
+          slot: 'img',
+          colProps: {
+            span: 24,
+          },
+        },
+        {
+          field: 'checkAccountImg',
+          component: 'Upload',
+          label: '到账回单',
+          required: true,
+          rules: [{ required: true, message: t('common.uploadMessge') }],
+          itemProps: {
+            validateTrigger: 'blur',
+          },
+          componentProps: {
+            api: uploadApi,
+            // fileFlow:true,
+            maxNumber: 6,
+            maxSize: 5,
+            accept: ['jpeg', 'jpg', 'png'],
+          },
+          colProps: {
+            span: 12,
+          },
+        },
+      ];
+      const [registerForm, { validate, resetFields, setFieldsValue }] = useForm({
+        labelWidth: 100,
+        schemas: schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+      onMounted(() => {});
+      // getFaultList();
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        repairId.value = data?.repairId;
+        data && onDataReceive(data);
+      });
+      async function getFaultList() {
+        const res = await faultAllList({});
+        fileFlow.faultList = res.map((item) => {
+          return {
+            ...item,
+            label: item.faultMsg,
+            value: item.faultId,
+          };
+        });
+      }
+
+      function onDataReceive(data) {
+        console.log('openOutModal', data, repairId.value);
+        resetFields();
+        // updateSchema({
+        //   field: 'faultIds',
+        //   componentProps: {
+        //     options: fileFlow.faultList,
+        //   },
+        // });
+        fileFlow.type = data.type;
+        fileFlow.cameraType = data.cameraType;
+        setFieldsValue({
+          ...data,
+          remark: '',
+          deviceInfo: t(`routes.scene.tableType.${data.cameraType}`) + data.cameraSnCode,
+        });
+      }
+      const handleSubmit = async () => {
+        const { checkAccountImg, repairId } = await validate();
+        try {
+          createConfirm({
+            iconType: 'warning',
+            title: () => h('span', '温馨提示'),
+            content: '确定提交到账登记吗?',
+            onOk: async () => {
+              loading.value = true;
+              await checkAccount({ checkAccountImg, repairId });
+              loading.value = false;
+              createMessage.success(t('common.optSuccess'));
+              closeModal();
+              emit('update');
+            },
+            onCancel: () => {
+              loading.value = false;
+            },
+          });
+        } catch (error) {
+          loading.value = false;
+          console.log('not passing', error);
+        }
+      };
+      return {
+        register,
+        registerForm,
+        fileFlow,
+        handleSubmit,
+        addListFunc,
+        resetFields,
+        loading,
+        t,
+      };
+    },
+  });
+</script>

+ 269 - 0
src/views/Accounting/index.vue

@@ -0,0 +1,269 @@
+<template>
+  <PageWrapper contentBackground>
+    <template #footer>
+      <a-tabs v-model:activeKey="tableType" @change="changeTable">
+        <a-tab-pane :key="0" tab="待核账" />
+      </a-tabs>
+    </template>
+    <div class="desc-wrap-BasicTable">
+      <BasicTable @register="registerTable">
+        <template #action="{ record }">
+          <TableAction
+            stopButtonPropagation
+            :actions="[
+              {
+                label: '详情',
+                //ifShow: getCheckPerm('U8Sending_detail'),
+                onClick: handleDetail.bind(null, record),
+              },
+              {
+                label: '到账登记',
+                //ifShow: getCheckPerm('U8Sending_register') && tableType == 0,
+                onClick: handleRecover.bind(null, record),
+              },
+            ]"
+          />
+        </template>
+      </BasicTable>
+      <partsListModal @update="reload" @register="registerRecovery" />
+      <!-- ifShow: getCheckPerm('device-out') && !Boolean(record.outType), -->
+    </div>
+  </PageWrapper>
+</template>
+<script lang="ts">
+  import { defineComponent, onMounted, ref, onActivated } from 'vue';
+  import { PageWrapper } from '/@/components/Page';
+  import {
+    BasicTable,
+    useTable,
+    TableAction,
+    BasicColumn,
+    // TableImg,
+    FormProps,
+  } from '/@/components/Table';
+  import { Tabs } from 'ant-design-vue';
+  import { operateSceneList } from '/@/api/operate';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { usePermissionStore } from '/@/store/modules/permission';
+  import partsListModal from './ListModal.vue';
+  import { useModal } from '/@/components/Modal';
+  import { useRouter } from 'vue-router';
+  import { checkAccountList } from '/@/api/spares';//getByRoleType
+  export default defineComponent({
+    name: '维修备件管理',
+    components: {
+      BasicTable,
+      TableAction,
+      // TableImg,
+      partsListModal,
+      PageWrapper,
+      [Tabs.name]: Tabs,
+      [Tabs.TabPane.name]: Tabs.TabPane,
+    },
+    setup() {
+      const { t } = useI18n();
+      const permissionStore = usePermissionStore();
+      const router = useRouter();
+      const { getCheckPerm } = permissionStore;
+      const tableType = ref<Recordable>(0); //0看看 、1看见、2深时
+      onMounted(() => {
+        // console.log(router.currentRoute.value.params.id);
+      });
+      const columns: BasicColumn[] = [
+        {
+          title: '报修日期',
+          dataIndex: 'createTime',
+          width: 180,
+        },
+        {
+          title: '客户名称',
+          dataIndex: 'companyName',
+          width: 80,
+          // customRender: ({ record }) => {
+          //   return t(`routes.equity.operation.${record.operationType || 0}`);
+          // },
+        },
+        {
+          title: '产品类型',
+          dataIndex: 'cameraType',
+          width: 80,
+          customRender: ({ record }) => {
+            return t(`routes.scene.tableType.${record.cameraType}`);
+          },
+        },
+        {
+          title: '产品SN码',
+          dataIndex: 'cameraSnCode',
+          width: 100,
+        },
+        {
+          title: '接单日期',
+          dataIndex: 'orderReceivingTime',
+          width: 100,
+        },
+        {
+          title: '维修工程师',
+          dataIndex: 'repairManName',
+          width: 100,
+        },
+        {
+          title: '故障分析',
+          dataIndex: 'checkResult',
+          width: 150,
+        },
+        {
+          title: '状态',
+          dataIndex: 'status',
+          width: 100,
+          customRender: ({ record }) => {
+            return t(`routes.spares.tableType.${record.status || 0}`);
+          },
+        },
+        {
+          title: '工单号',
+          dataIndex: 'repairId',
+          width: 150,
+        },
+        {
+          title: t('common.operating'),
+          dataIndex: 'action',
+          slots: { customRender: 'action' },
+          ifShow: true,
+          fixed: 'right',
+          flag: 'ACTION',
+          width: 120,
+        },
+      ];
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 120,
+        autoAdvancedLine: 1,
+        actionColOptions: {
+          span: 24,
+        },
+        schemas: [
+          {
+            field: 'cameraType',
+            component: 'Select',
+            label: '产品类型',
+            colProps: {
+              xl: 7,
+              xxl: 7,
+            },
+            componentProps: {
+              options: [
+                {
+                  label: t('routes.device.type.1'),
+                  value: 0,
+                  key: '0',
+                },
+                {
+                  label: t('routes.device.type.2'),
+                  value: 1,
+                  key: '1',
+                },
+                {
+                  label: t('routes.device.type.3'),
+                  value: 2,
+                  key: '2',
+                },
+              ],
+            },
+          },
+          {
+            field: 'cameraSnCode',
+            component: 'Input',
+            label: t('routes.device.snCode'),
+            colProps: {
+              xl: 7,
+              xxl: 7,
+            },
+          },
+          // {
+          //   field: 'repairManId',
+          //   label: '维修工程师',
+          //   component: 'ApiSelect',
+          //   componentProps: {
+          //     api: getByRoleType,
+          //     numberToString: true,
+          //     labelField: 'nickName',
+          //     valueField: 'id',
+          //     immediate: true,
+          //     params: {
+          //       roleType: 3,
+          //     },
+          //   },
+          //   colProps: {
+          //     span: 7,
+          //   },
+          // },
+          {
+            field: 'repairId',
+            component: 'Input',
+            label: '工单号',
+            colProps: {
+              xl: 7,
+              xxl: 7,
+            },
+          },
+        ],
+      };
+      const [registerRecovery, { openModal }] = useModal();
+      const [registerTable, { reload }] = useTable({
+        api: checkAccountList,
+        columns: columns,
+        useSearchForm: true,
+        searchInfo: { statusParam: tableType },
+        formConfig: searchForm,
+        showTableSetting: true,
+        showIndexColumn: false,
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },
+        canResize: false,
+      });
+      onActivated(() => {
+        reload();
+      });
+      async function handleDetail(record: Recordable) {
+        console.log('record', record);
+        router.push({ path: `detail/${record.repairId || '20230215174919387'}` });
+      }
+      async function handleRecover(record: Recordable) {
+        openModal(true, {
+          tableType: tableType.value,
+          ...record,
+        });
+      }
+      function handleOrder() {
+        openModal(true);
+      }
+      function changeTable(val: string) {
+        tableType.value = val;
+        reload();
+      }
+      return {
+        registerTable,
+        reload,
+        t,
+        tableType,
+        changeTable,
+        handleOrder,
+        getCheckPerm,
+        handleDetail,
+        handleRecover,
+        registerRecovery,
+      };
+    },
+  });
+</script>
+<style lang="less" scoped>
+  .desc-wrap-BasicTable {
+    background-color: #f0f2f5;
+    .vben-basic-table-form-container {
+      padding: 0;
+    }
+  }
+</style>

+ 167 - 0
src/views/U8Sending/ListModal.vue

@@ -0,0 +1,167 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    :title="fileFlow.title"
+    width="700px"
+    @cancel="resetFields"
+    :confirmLoading="loading"
+    @ok="handleSubmit"
+  >
+    <div class="pt-2px pr-3px">
+      <BasicForm @register="registerForm">
+        <template #text="{ model, field }">
+          {{ model[field] }}
+        </template>
+      </BasicForm>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, h, onMounted, reactive, ref } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import {
+    partAllList,
+    faultAllList,
+    checkRegister,
+    partInfo,
+    partInfo,
+    checkRegisterInfo,
+    u8Send,
+  } from '/@/api/spares';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { uploadApi } from '/@/api/product/index';
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['update', 'register'],
+    setup(props, { emit }) {
+      const n = ref(1);
+      const repairId = ref('');
+      const fileFlow = reactive({
+        file: null,
+        title: '发件登记',
+        repairId: null,
+        cameraType: 0,
+        type: 2, //2-普通发票,3-专用发票
+        faultList: [],
+      });
+      const loading = ref(false);
+      const { createMessage, createConfirm } = useMessage();
+      let schemas: FormSchema[] = [
+        {
+          field: 'repairId',
+          component: 'Input',
+          label: '维修单号',
+          slot: 'text',
+          colProps: {
+            span: 24,
+          },
+        },
+        {
+          field: 'deviceInfo',
+          component: 'Input',
+          label: '设备信息',
+          slot: 'text',
+          colProps: {
+            span: 18,
+          },
+        },
+        {
+          field: 'trackingNum',
+          component: 'Input',
+          label: '发货单号',
+          required: true,
+          componentProps: {
+            maxLength: 50,
+          },
+          colProps: {
+            span: 16,
+          },
+        },
+      ];
+      const [registerForm, { validate, resetFields, setFieldsValue }] = useForm({
+        labelWidth: 100,
+        schemas: schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+      onMounted(() => {});
+      // getFaultList();
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        repairId.value = data?.repairId;
+        data && onDataReceive(data);
+      });
+      async function getFaultList() {
+        const res = await faultAllList({});
+        fileFlow.faultList = res.map((item) => {
+          return {
+            ...item,
+            label: item.faultMsg,
+            value: item.faultId,
+          };
+        });
+      }
+
+      function onDataReceive(data) {
+        console.log('openOutModal', data, repairId.value);
+        resetFields();
+        // updateSchema({
+        //   field: 'faultIds',
+        //   componentProps: {
+        //     options: fileFlow.faultList,
+        //   },
+        // });
+        fileFlow.type = data.type;
+        fileFlow.cameraType = data.cameraType;
+        setFieldsValue({
+          ...data,
+          remark: '',
+          deviceInfo: t(`routes.scene.tableType.${data.cameraType}`) + data.cameraSnCode,
+        });
+      }
+      const handleSubmit = async () => {
+        const params = await validate();
+        try {
+          createConfirm({
+            iconType: 'warning',
+            title: () => h('span', '温馨提示'),
+            content: '确定提交发件登记吗?',
+            onOk: async () => {
+              loading.value = true;
+              await u8Send(params);
+              loading.value = false;
+              createMessage.success(t('common.optSuccess'));
+              closeModal();
+              emit('update');
+            },
+            onCancel: () => {
+              loading.value = false;
+            },
+          });
+        } catch (error) {
+          loading.value = false;
+          console.log('not passing', error);
+        }
+      };
+      return {
+        register,
+        registerForm,
+        fileFlow,
+        handleSubmit,
+        addListFunc,
+        resetFields,
+        loading,
+        t,
+      };
+    },
+  });
+</script>

+ 270 - 0
src/views/U8Sending/index.vue

@@ -0,0 +1,270 @@
+<template>
+  <PageWrapper contentBackground>
+    <template #footer>
+      <a-tabs v-model:activeKey="tableType" @change="changeTable">
+        <a-tab-pane :key="0" tab="待发件" />
+        <a-tab-pane :key="1" tab="已发件" />
+      </a-tabs>
+    </template>
+    <div class="desc-wrap-BasicTable">
+      <BasicTable @register="registerTable">
+        <template #action="{ record }">
+          <TableAction
+            stopButtonPropagation
+            :actions="[
+              {
+                label: '详情',
+                ifShow: getCheckPerm('U8Sending_detail'),
+                onClick: handleDetail.bind(null, record),
+              },
+              {
+                label: '发件登记',
+                ifShow: getCheckPerm('U8Sending_register') && record.status == 41,
+                onClick: handleRecover.bind(null, record),
+              },
+            ]"
+          />
+        </template>
+      </BasicTable>
+      <partsListModal @update="reload" @register="registerRecovery" />
+      <!-- ifShow: getCheckPerm('device-out') && !Boolean(record.outType), -->
+    </div>
+  </PageWrapper>
+</template>
+<script lang="ts">
+  import { defineComponent, onMounted, ref, onActivated } from 'vue';
+  import { PageWrapper } from '/@/components/Page';
+  import {
+    BasicTable,
+    useTable,
+    TableAction,
+    BasicColumn,
+    // TableImg,
+    FormProps,
+  } from '/@/components/Table';
+  import { Tabs } from 'ant-design-vue';
+  import { operateSceneList } from '/@/api/operate';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { usePermissionStore } from '/@/store/modules/permission';
+  import partsListModal from './ListModal.vue';
+  import { useModal } from '/@/components/Modal';
+  import { useRouter } from 'vue-router';
+  import { u8ListList } from '/@/api/spares';//getByRoleType
+  export default defineComponent({
+    name: '维修备件管理',
+    components: {
+      BasicTable,
+      TableAction,
+      // TableImg,
+      partsListModal,
+      PageWrapper,
+      [Tabs.name]: Tabs,
+      [Tabs.TabPane.name]: Tabs.TabPane,
+    },
+    setup() {
+      const { t } = useI18n();
+      const permissionStore = usePermissionStore();
+      const router = useRouter();
+      const { getCheckPerm } = permissionStore;
+      const tableType = ref<Recordable>(0); //0看看 、1看见、2深时
+      onMounted(() => {
+        // console.log(router.currentRoute.value.params.id);
+      });
+      const columns: BasicColumn[] = [
+        {
+          title: '报修日期',
+          dataIndex: 'createTime',
+          width: 180,
+        },
+        {
+          title: '客户名称',
+          dataIndex: 'companyName',
+          width: 80,
+          // customRender: ({ record }) => {
+          //   return t(`routes.equity.operation.${record.operationType || 0}`);
+          // },
+        },
+        {
+          title: '产品类型',
+          dataIndex: 'cameraType',
+          width: 80,
+          customRender: ({ record }) => {
+            return t(`routes.scene.tableType.${record.cameraType}`);
+          },
+        },
+        {
+          title: '产品SN码',
+          dataIndex: 'cameraSnCode',
+          width: 100,
+        },
+        {
+          title: '接单日期',
+          dataIndex: 'orderReceivingTime',
+          width: 100,
+        },
+        {
+          title: '维修工程师',
+          dataIndex: 'repairManName',
+          width: 100,
+        },
+        {
+          title: '故障分析',
+          dataIndex: 'checkResult',
+          width: 150,
+        },
+        {
+          title: '状态',
+          dataIndex: 'status',
+          width: 100,
+          customRender: ({ record }) => {
+            return t(`routes.spares.tableType.${record.status || 0}`);
+          },
+        },
+        {
+          title: '工单号',
+          dataIndex: 'repairId',
+          width: 150,
+        },
+        {
+          title: t('common.operating'),
+          dataIndex: 'action',
+          slots: { customRender: 'action' },
+          ifShow: true,
+          fixed: 'right',
+          flag: 'ACTION',
+          width: 120,
+        },
+      ];
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 120,
+        autoAdvancedLine: 1,
+        actionColOptions: {
+          span: 24,
+        },
+        schemas: [
+          {
+            field: 'cameraType',
+            component: 'Select',
+            label: '产品类型',
+            colProps: {
+              xl: 7,
+              xxl: 7,
+            },
+            componentProps: {
+              options: [
+                {
+                  label: t('routes.device.type.1'),
+                  value: 0,
+                  key: '0',
+                },
+                {
+                  label: t('routes.device.type.2'),
+                  value: 1,
+                  key: '1',
+                },
+                {
+                  label: t('routes.device.type.3'),
+                  value: 2,
+                  key: '2',
+                },
+              ],
+            },
+          },
+          {
+            field: 'cameraSnCode',
+            component: 'Input',
+            label: t('routes.device.snCode'),
+            colProps: {
+              xl: 7,
+              xxl: 7,
+            },
+          },
+          // {
+          //   field: 'repairManId',
+          //   label: '维修工程师',
+          //   component: 'ApiSelect',
+          //   componentProps: {
+          //     api: getByRoleType,
+          //     numberToString: true,
+          //     labelField: 'nickName',
+          //     valueField: 'id',
+          //     immediate: true,
+          //     params: {
+          //       roleType: 3,
+          //     },
+          //   },
+          //   colProps: {
+          //     span: 7,
+          //   },
+          // },
+          {
+            field: 'repairId',
+            component: 'Input',
+            label: '工单号',
+            colProps: {
+              xl: 7,
+              xxl: 7,
+            },
+          },
+        ],
+      };
+      const [registerRecovery, { openModal }] = useModal();
+      const [registerTable, { reload }] = useTable({
+        api: u8ListList,
+        columns: columns,
+        useSearchForm: true,
+        searchInfo: { statusParam: tableType },
+        formConfig: searchForm,
+        showTableSetting: true,
+        showIndexColumn: false,
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },
+        canResize: false,
+      });
+      onActivated(() => {
+        reload();
+      });
+      async function handleDetail(record: Recordable) {
+        console.log('record', record);
+        router.push({ path: `detail/${record.repairId || '20230215174919387'}` });
+      }
+      async function handleRecover(record: Recordable) {
+        openModal(true, {
+          tableType: tableType.value,
+          ...record,
+        });
+      }
+      function handleOrder() {
+        openModal(true);
+      }
+      function changeTable(val: string) {
+        tableType.value = val;
+        reload();
+      }
+      return {
+        registerTable,
+        reload,
+        t,
+        tableType,
+        changeTable,
+        handleOrder,
+        getCheckPerm,
+        handleDetail,
+        handleRecover,
+        registerRecovery,
+      };
+    },
+  });
+</script>
+<style lang="less" scoped>
+  .desc-wrap-BasicTable {
+    background-color: #f0f2f5;
+    .vben-basic-table-form-container {
+      padding: 0;
+    }
+  }
+</style>

+ 47 - 45
src/views/spares/remarksModal.vue

@@ -10,7 +10,7 @@
     <div class="pt-2px pr-3px">
       <BasicForm @register="registerForm">
         <template #text="{ model, field }">
-          {{ model[field]  }}
+          {{ model[field] }}
         </template>
       </BasicForm>
     </div>
@@ -34,53 +34,55 @@
     emits: ['update', 'register'],
     setup(props, { emit }) {
       const fileFlow = reactive({
-        file:null,
-        type:2,//2-普通发票,3-专用发票
-      })
-      const loading = ref(false)
+        file: null,
+        type: 2, //2-普通发票,3-专用发票
+      });
+      const loading = ref(false);
       const { createMessage } = useMessage();
       const schemas: FormSchema[] = [
-          {
-            field: 'id',
-            component: 'Input',
-            show:false,
-            label: '发票编号',
+        {
+          field: 'id',
+          component: 'Input',
+          show: false,
+          label: '发票编号',
+        },
+        {
+          field: 'repairId',
+          component: 'Input',
+          label: '维修单号',
+          slot: 'text',
+          colProps: {
+            span: 24,
+          },
+        },
+        {
+          field: 'deviceType',
+          component: 'Input',
+          label: '设备信息',
+          slot: 'text',
+          colProps: {
+            span: 24,
+          },
+        },
+        {
+          field: 'remark',
+          component: 'InputTextArea',
+          required: true,
+          label: '备注',
+          componentProps: {
+            maxLength: 500,
+            rows: 4,
+            placeholder: '请填写备注',
+          },
+          colProps: {
+            span: 22,
           },
-          {
-            field: 'repairId',
-            component: 'Input',
-            label: '维修单号',
-            slot: 'text',
-            colProps: {
-              span: 24,
-            },
-          },{
-            field: 'deviceType',
-            component: 'Input',
-            label: '设备信息',
-            slot: 'text',
-            colProps: {
-              span: 24,
-            },
-          },{
-            field: 'remark',
-            component: 'InputTextArea',
-            required: true,
-            label: '备注',
-            componentProps: {
-              maxLength: 500,
-              rows:4,
-              placeholder: '请填写备注',
-            },
-            colProps: {
-              span: 22,
-            },
         },
       ];
 
       const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
         labelWidth: 120,
-        schemas:schemas,
+        schemas: schemas,
         showActionButtonGroup: false,
         actionColOptions: {
           span: 24,
@@ -93,14 +95,14 @@
       });
       function onDataReceive(data) {
         resetFields();
-        fileFlow.type = data.type
+        fileFlow.type = data.type;
         setFieldsValue({
           ...data,
-          deviceType:t(`routes.scene.tableType.${data.cameraType}`) +' '+ data.cameraSnCode
+          deviceType: t(`routes.scene.tableType.${data.cameraType}`) + ' ' + data.cameraSnCode,
         });
       }
       const handleSubmit = async () => {
-        loading.value = true
+        loading.value = true;
         try {
           const params = await validate();
           await updateRemark(params);
@@ -108,9 +110,9 @@
           resetFields();
           createMessage.success(t('common.optSuccess'));
           emit('update');
-          loading.value = false
+          loading.value = false;
         } catch (error) {
-          loading.value = false
+          loading.value = false;
           console.log('not passing', error);
         }
       };

+ 6 - 0
src/views/work/aftermarket.vue

@@ -5,6 +5,11 @@
         数据导出</a-button
       >
     </template>
+    <template #href="{ record }">
+          <a v-if="record.repairId" :href="`/#/work/detail/${record.repairId}`">{{record.repairId}}</a>
+          <!-- <span v-else-if="record.sceneName">{{record.sceneName}}</span>
+          <span v-else>-</span> -->
+        </template>
   </BasicTable>
 </template>
 <script lang="ts">
@@ -71,6 +76,7 @@
           title: '维修单号',
           dataIndex: 'repairId',
           width: 150,
+          slots: { customRender: 'href' },
         },
         {
           title: '订单金额(元)',

+ 23 - 2
src/views/work/checkModel.vue

@@ -33,7 +33,7 @@
   import { BasicModal, useModalInner } from '/@/components/Modal';
   import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
   import { useMessage } from '/@/hooks/web/useMessage';
-  import { partAllList, faultAllList, checkRegister } from '/@/api/spares';
+  import { partAllList, faultAllList, checkRegister, checkRegisterInfo } from '/@/api/spares';
   import { useI18n } from '/@/hooks/web/useI18n';
   import { uploadApi } from '/@/api/product/index';
 
@@ -193,8 +193,28 @@
         });
       }
 
-      function onDataReceive(data) {
+      async function onDataReceive(data) {
         resetFields();
+        let backfill = {
+          faultIds: [],
+          defineDamage: 0,
+          checkResult: '',
+          checkImg: [],
+        };
+        if (data.status == 20) {
+          let res = await checkRegisterInfo({repairId:'20230506152208120'||data.repairId})
+          console.log('repairId',res)
+          let index = n.value
+          res.partList.map((ele,b) => {
+            backfill[`partId${index+b}`] = ele.partId
+            backfill[`partCount${index+b}`] = ele.partCount
+            add()
+          })
+          backfill.faultIds = res.faultIds
+          backfill.defineDamage = res.defineDamage
+          backfill.checkResult = res.checkResult
+          backfill.checkImg = res.checkImg
+        }
         updateSchema([
           {
             field: 'faultIds',
@@ -211,6 +231,7 @@
         fileFlow.cameraType = data.cameraType;
         setFieldsValue({
           ...data,
+          ...backfill,
           warrantyExpirationDateText: `${data.warrantyDate} (${
             data.warrantyType == 0 ? '保内维修' : data.warrantyType == 1 ? '保内转保外' : '保外维修'
           })`,

+ 50 - 3
src/views/work/confirmPriceModal.vue

@@ -6,13 +6,14 @@
     width="600px"
     @cancel="clearInfo"
     :confirmLoading="loading"
+    @ok="handleApi"
   >
-    <template #footer>
+    <!-- <template #footer>
       <div style="text-align: center">
         <a-button type="primary" danger @click="handleCancel">取消维修</a-button>
         <a-button type="primary" @click="handleSubmit">确认维修</a-button>
       </div>
-    </template>
+    </template> -->
     <div class="pt-2px pr-3px">
       <BasicForm @register="registerForm">
         <template #text="{ model, field }">
@@ -87,6 +88,50 @@
             span: 18,
           },
         },
+        {
+          field: 'confirm',
+          component: 'RadioGroup',
+          label: '维修意向',
+          defaultValue: 0,
+          componentProps: {
+            options: [
+              {
+                label: '确认维修',
+                value: 0,
+              },
+              {
+                label: '取消维修',
+                value: 1,
+              },
+            ],
+            onChange: (val) => {
+              console.log('ifShow',val)
+              updateSchema({
+                field: 'remark',
+                required: val.target.value == 1,
+                ifShow: val.target.value == 1,
+              })
+            },
+          },
+          colProps: {
+            span: 22,
+          },
+        },
+        {
+          field: 'remark',
+          component: 'InputTextArea',
+          ifShow: false,
+          required: false,
+          label: '取消原因',
+          componentProps: {
+            maxLength: 500,
+            rows: 4,
+            placeholder: '请填写取消原因',
+          },
+          colProps: {
+            span: 18,
+          },
+        },
       ];
 
       const [
@@ -269,8 +314,9 @@
         handleApi(true);
       };
 
-      const handleApi = async (val) => {
+      const handleApi = async () => {
         const params = await validate();
+        let val = params.confirm == 1;
         try {
           createConfirm({
             iconType: 'warning',
@@ -344,6 +390,7 @@
         loading,
         clearInfo,
         updataCount,
+        handleApi,
         t,
         del,
         add,

+ 1 - 0
src/views/work/detail.vue

@@ -474,6 +474,7 @@
             total: '-' + priceTotal.value,
           });
         }
+        console.log('newdataSource', newdataSource, dataSource, countItem.total, res.priceList)
         if (countItem.total && res.priceList.length) {
           setTableData(cloneDeep([...dataSource, ...addItemList]));
         }

+ 5 - 0
src/views/work/maintenance.vue

@@ -32,6 +32,11 @@
                 ifShow: getCheckPerm('maintenance_testing') && tableType == 0,
                 onClick: handleRecover.bind(null, record),
               },
+              {
+                label: '修改定损',
+                ifShow: getCheckPerm('maintenance_testing') && tableType == 1 && record.status == 20,
+                onClick: handleRecover.bind(null, record),
+              },
             ]"
           />
         </template>

+ 70 - 6
src/views/work/partsListModal.vue

@@ -9,16 +9,27 @@
     :min-height="0"
   >
     <div class="pt-2px pr-3px recoverPage">
-      <div class="form_item"><div class="item_lable">维修单号:</div>{{ modelRef.repairId }}</div>
-      <div class="form_item"
-        ><div class="item_lable">维修工程师:</div>{{ modelRef.repairManName }}</div
-      >
+      <!-- <div class="form_item"><div class="item_lable">维修单号:</div>{{ modelRef.repairId }}</div>
+      <div class="form_item">
+        <div class="item_lable">维修工程师:</div>{{ modelRef.repairManName }}
+      </div> -->
+      <BasicForm @register="registerForm">
+        <template #text="{ model, field }">
+          {{ model[field] }}
+        </template>
+      </BasicForm>
       <BasicTable @register="registerTable" />
       <div class="tips">{{
         modelRef.title == '备件出库'
           ? '注:请按备件清单给维修工程师提供备件'
           : '回收说明:完成维修,请回收废旧备件;取消维修,请回收新的备件 (自动恢复库存)。'
       }}</div>
+      <!-- <div class="form_item">
+        <div class="item_lable">回收备注:</div>
+        <dir>
+          <a-textarea v-model="ramak" placeholder="请填写回收备注" show-count :maxlength="100" />
+        </dir>
+      </div> -->
     </div>
   </BasicModal>
 </template>
@@ -26,24 +37,56 @@
   import { defineComponent, ref, onMounted, h } from 'vue';
   import { BasicModal, useModalInner } from '/@/components/Modal';
   import { BasicTable, useTable, BasicColumn } from '/@/components/Table';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
   import { useMessage } from '/@/hooks/web/useMessage';
   import { partInfo, partRecovery, partOut } from '/@/api/spares';
   import { useI18n } from '/@/hooks/web/useI18n';
   const { t } = useI18n();
   export default defineComponent({
-    components: { BasicModal, BasicTable },
+    components: { BasicModal, BasicTable, BasicForm },
     props: {
       userData: { type: Object },
     },
     emits: ['update'],
     setup(_, { emit }) {
       const repairId = ref('');
+      const ramak = ref('');
       const type = ref(0);
       const modelRef = ref({
         title: '设备入库',
         repairId: '0000123',
         repairManName: '',
       });
+      const schemas: FormSchema[] = [
+        {
+          field: 'repairId',
+          component: 'Input',
+          label: '维修单号',
+          slot: 'text',
+          colProps: {
+            span: 24,
+          },
+        },
+        {
+          field: 'deviceInfo',
+          component: 'Input',
+          label: '设备信息',
+          slot: 'text',
+          colProps: {
+            span: 18,
+          },
+        },
+        {
+          field: 'remark',
+          component: 'InputTextArea',
+          label: '回收备注',
+          componentProps: {
+            maxLength: 500,
+            rows: 4,
+            placeholder: '请填写备注',
+          },
+        },
+      ];
       const columns: BasicColumn[] = [
         {
           title: '备件编号',
@@ -61,6 +104,14 @@
           width: 100,
         },
       ];
+      const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
+        labelWidth: 100,
+        schemas: schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
       const [registerTable, { reload }] = useTable({
         api: partInfo,
         searchInfo: { repairId: repairId, type: type },
@@ -82,20 +133,31 @@
         repairId.value = data.repairId;
         modelRef.value.repairId = data.repairId;
         modelRef.value.repairManName = data.repairManName;
+        updateSchema({
+          field: 'remark',
+          ifShow: data.status != 50,
+        });
+        setFieldsValue({
+          ...data,
+          deviceInfo: data.repairManName,
+          remark: '',
+        });
         reload();
       }
       function handleVisibleChange() {}
 
       const handleSubmit = async () => {
         let api = modelRef.value.title == '备件出库' ? partOut : partRecovery;
+        const { remark } = await validate();
         createConfirm({
           iconType: 'warning',
           title: () => h('span', '温馨提示'),
           content: `确定要提交${modelRef.value.title == '备件出库' ? '出库' : '备件回收'}吗?`,
           onOk: async () => {
-            await api({ repairId: modelRef.value.repairId });
+            await api({ repairId: modelRef.value.repairId, remark });
             createMessage.success(t('common.optSuccess'));
             closeModal();
+            resetFields()
             emit('update');
           },
         });
@@ -104,10 +166,12 @@
         register,
         modelRef,
         registerTable,
+        registerForm,
         handleVisibleChange,
         handleSubmit,
         addListFunc,
         t,
+        ramak,
       };
     },
   });

+ 377 - 293
src/views/work/quoteModel.vue

@@ -11,25 +11,29 @@
     <div class="pt-2px pr-3px">
       <BasicForm @register="registerForm">
         <template #text="{ model, field }">
-          {{ model[field] }}
+          {{ model[field] || '明细' }}
         </template>
         <template #add>
           <div>
-            <!-- <Button  @click="add" style="margin-left:20px">添加人工</Button> -->
-            <Button  @click="updataRepairInfo">重置</Button>
+            <Button @click="updataRepairInfo">重置</Button>
+            <Button  @click="add" style="margin-left:20px">添加明细</Button>
           </div>
-        </template> 
+        </template>
         <template #del="{ field }">
-          <Button @click="del(field)">删除</Button>
+          <Icon v-if="(n - 1) == field" @click="del(field)" icon="ant-design:close-circle-outlined" :size="18" :class="`mr-2`" />
+          <!-- <Button v-if="(n - 1) == field" @click="del(field)">删除</Button> -->
         </template>
         <template #delList="{ field }">
-          <Button @click="del(field)">删除</Button>
+          <Button @click="del(field)"><close-circle-outlined /></Button>
         </template>
       </BasicForm>
       <div class="priceCount">
         <span>合计:</span>
-        <div class="label">总价:{{ fileFlow.priceCount || 0 }}元 <Button :preIcon="'outline-refresh'"  @click="updataCount"><RedoOutlined /></Button></div>
-        <p style="padding-top:15px">注:提交报价后,需等待报修人确认后再进行维修</p>
+        <div class="label"
+          >总价:{{ fileFlow.priceCount || 0 }}元
+          <Button :preIcon="'outline-refresh'" @click="updataCount"><RedoOutlined /></Button
+        ></div>
+        <p style="padding-top: 15px">注:提交报价后,需等待报修人确认后再进行维修</p>
       </div>
     </div>
   </BasicModal>
@@ -39,388 +43,467 @@
   import { BasicModal, useModalInner } from '/@/components/Modal';
   import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
   import { useMessage } from '/@/hooks/web/useMessage';
-  import { getPriceList, checkRegisterInfo, addOrUpdatePriceList, allList } from '/@/api/spares'
-  import { Checkbox, Button } from 'ant-design-vue';
+  import { getPriceList, addOrUpdatePriceList, allList } from '/@/api/spares';
+  import { Button } from 'ant-design-vue';
+  import Icon from '/@/components/Icon/index';
   import { useI18n } from '/@/hooks/web/useI18n';
-  import { uploadApi } from '/@/api/product/index';
-  import { RedoOutlined, } from '@ant-design/icons-vue';
+  import { RedoOutlined } from '@ant-design/icons-vue';
   const { t } = useI18n();
   export default defineComponent({
-    components: { BasicModal, BasicForm, RedoOutlined, Checkbox, Button },
+    components: { BasicModal, BasicForm, RedoOutlined, Button, Icon },
     props: {
       userData: { type: Object },
     },
     emits: ['update', 'register'],
-    setup(props, { emit }) {
+    setup(_, { emit }) {
       const n = ref(1);
       const fileFlow = reactive({
-        file:null,
-        type:2,//2-普通发票,3-专用发票
-        count:1,//第一次报价
-        priceCount:0,//总价
-        priceLists:[],
-        priceListsPrice:{},
-        manMadeList:[],
-      })
-      const loading = ref(false)
-      const { createMessage,createConfirm } = useMessage();
+        file: null,
+        type: 2, //2-普通发票,3-专用发票
+        count: 1, //第一次报价
+        priceCount: 0, //总价
+        priceLists: [],
+        priceListsPrice: {},
+        manMadeList: [],
+      });
+      const loading = ref(false);
+      const { createMessage, createConfirm } = useMessage();
       const schemas: FormSchema[] = [
-          {
-            field: 'id',
-            component: 'Input',
-            show:false,
-            label: '发票编号',
+        {
+          field: 'id',
+          component: 'Input',
+          show: false,
+          label: '发票编号',
+        },
+        {
+          field: 'repairId',
+          component: 'Input',
+          label: '维修单号',
+          slot: 'text',
+          colProps: {
+            span: 24,
           },
-          {
-            field: 'repairId',
-            component: 'Input',
-            label: '维修单号',
-            slot: 'text',
-            colProps: {
-              span: 24,
-            },
-          },{
-            field: 'deviceInfo',
-            component: 'Input',
-            label: '设备信息',
-            slot: 'text',
-            colProps: {
-              span: 18,
-            },
-          },{
-            field: 'warrantyExpirationDateText',
-            component: 'Input',
-            slot: 'text',
-            label: '保修届满日期',
-          },{
-            field: 'checkResult',
-            component: 'Input',
-            label: '检测结果',
-            slot: 'text',
-            colProps: {
-              span: 18,
-            },
-          },{
-            field: '0',
-            component: 'Input',
-            label: '报价明细',
-            labelWidth:0,
-            colProps: {
-              span: 24,
-            },
-            slot: 'add',
-          },{
-            field: 'manMade',
-            component: 'CheckboxGroup',
-            label: '人工费',
-            labelWidth:0,
-            componentProps: {
-              options: fileFlow.manMadeList,
-              maxLength: 50,
-              onChange:(val)=>{
-                setTimeout(() => {
-                updataCount()
-              }, 100)
-              },
-            },
-            colProps: {
-              span: 24,
+        },
+        {
+          field: 'deviceInfo',
+          component: 'Input',
+          label: '设备信息',
+          slot: 'text',
+          colProps: {
+            span: 18,
+          },
+        },
+        {
+          field: 'warrantyExpirationDateText',
+          component: 'Input',
+          slot: 'text',
+          label: '保修届满日期',
+          colProps: {
+            span: 14,
+          },
+        },
+        {
+          field: 'convertWarranty',
+          component: 'Checkbox',
+          labelWidth: 0,
+          label: '',
+          suffix: '保外转包内',
+          componentProps: {
+            name: 'wodeces',
+            label: 'wodeces',
+          },
+          colProps: {
+            span: 4,
+          },
+        },
+        {
+          field: 'checkResult',
+          component: 'Input',
+          label: '检测结果',
+          slot: 'text',
+          colProps: {
+            span: 18,
+          },
+        },
+        {
+          field: '0',
+          component: 'Input',
+          label: '报价明细',
+          labelWidth: 0,
+          colProps: {
+            span: 24,
+          },
+          slot: 'add',
+        },
+        {
+          field: 'manMade',
+          component: 'CheckboxGroup',
+          label: '人工费',
+          labelWidth: 0,
+          componentProps: {
+            options: fileFlow.manMadeList,
+            maxLength: 50,
+            onChange: () => {
+              setTimeout(() => {
+                updataCount();
+              }, 100);
             },
           },
+          colProps: {
+            span: 24,
+          },
+        },
       ];
 
-      const [registerForm, { validate, getFieldsValue, resetFields, setFieldsValue, removeSchemaByFiled, appendSchemaByField, updateSchema }] = useForm({
+      const [
+        registerForm,
+        {
+          validate,
+          getFieldsValue,
+          resetFields,
+          setFieldsValue,
+          removeSchemaByFiled,
+          appendSchemaByField,
+        },
+      ] = useForm({
         labelWidth: 100,
-        labelAlign:'left',
-        schemas:schemas,
+        labelAlign: 'left',
+        schemas: schemas,
         showActionButtonGroup: false,
         actionColOptions: {
           span: 24,
         },
       });
       onMounted(async () => {
-        let allListOption = await allList()//获取价格
-        console.log('allList',allListOption)
-        fileFlow.priceListsPrice
-        allListOption.map(ele => {
+        let allListOption = await allList({}); //获取价格
+        fileFlow.priceListsPrice;
+        allListOption.map((ele) => {
           fileFlow.manMadeList.push({
             ...ele,
             label: `${ele.name} ${ele.price}元`,
             value: ele.laborCostId,
-          })
-          fileFlow.priceListsPrice[ele.laborCostId] = ele.price
-        })
+          });
+          fileFlow.priceListsPrice[ele.laborCostId] = ele.price;
+        });
       });
       let addListFunc = () => {};
       const [register, { closeModal }] = useModalInner((data) => {
         data && onDataReceive(data);
       });
       async function updataRepairInfo() {
-        let { repairId } = getFieldsValue()
-        console.log('20230228171427939',repairId)
-        const { priceLists, count } = await getPriceList({repairId})//
-        addPriceItem(priceLists)
-        clearInfo(true)
+        let { repairId } = getFieldsValue();
+        const { priceLists, count } = await getPriceList({ repairId }); //
+        addPriceItem(priceLists);
+        clearInfo(true);
         setTimeout(() => {
-          updataCount()
+          updataCount();
         }, 100);
       }
       async function onDataReceive(data) {
-
-        const { priceLists, count } = await getPriceList({repairId:data.repairId})//
-        addPriceItem(priceLists)
+        const { priceLists, count } = await getPriceList({ repairId: data.repairId }); //
+        addPriceItem(priceLists);
         resetFields();
-        fileFlow.type = data.type
+        fileFlow.type = data.type;
         setFieldsValue({
           ...data,
-          warrantyExpirationDateText: `${data.warrantyDate} (${data.warrantyType==0?'保内维修':data.warrantyType==1?'保内转保外':'保外维修'})`,
-          deviceInfo:t(`routes.scene.tableType.${data.cameraType}`)+data.cameraSnCode
+          warrantyExpirationDateText: `${data.warrantyDate} (${
+            data.warrantyType == 0 ? '保内维修' : data.warrantyType == 1 ? '保内转保外' : '保外维修'
+          })`,
+          deviceInfo: t(`routes.scene.tableType.${data.cameraType}`) + data.cameraSnCode,
         });
       }
       function del(field) {
-        removeSchemaByFiled([`deviceType${field}`, `device_${field}`, `${field}`]);
-        // n.value--;
+        removeSchemaByFiled([`deviceTypeId${field}`, `deviceType${field}`, `device_${field}`, `${field}`]);
+        n.value--;
       }
       function add() {
         let list = addSchemas(n.value);
-        list.map(ele => {
-          appendSchemaByField(ele,'')
-        })
-        n.value++
+        list.map((ele) => {
+          appendSchemaByField(ele, '');
+        });
+        n.value++;
       }
-      function addPriceItem(list){
-        fileFlow.priceLists = list
-        let priceSchema = [],valueObj = {},count=0
-        let manMade = [],countIndex = 0
-        console.log('addPriceItem',fileFlow.priceLists)
-        fileFlow.priceLists.map((ele,index) => {
-          if(ele.type == 1){//人工费
-            manMade.push(ele.partId)
-            count = count + ele.count*ele.price
-          }else{//备件
-          countIndex++
-          let price = ele.discount == 1?ele.priceDiscount:ele.price
-          valueObj[`priceList${ele.priceListId}`] = ele.count || 0
-          valueObj[`priceListText${ele.priceListId}`] = `${ele.name} ${ele.price} 元/${ele.type == 0?ele.partUnit:''}`
-          valueObj[`discount${ele.priceListId}`] = ele.discount == 1?[0]:[]
-          count = count + ele.count*price
-          priceSchema.push({
-          // priceSchema.unshift({
-            field: 'priceListText' + ele.priceListId,
-            component: 'InputNumber',
-            label: countIndex,
-            labelWidth:20,
-            slot: 'text',
-            // labelWidth:300,
-            // subLabel:"数量",
-            colProps: {
-              span: Boolean(ele.priceDiscount)?8:16,
-            }
-          },{
-            field: 'discount' + ele.priceListId,
-            component: 'CheckboxGroup',
-            ifShow:Boolean(ele.priceDiscount),
-            componentProps: {
-              onChange:(val)=>{
-                setTimeout(() => {
-                updataCount()
-              }, 100)
+      function addPriceItem(list) {
+        fileFlow.priceLists = list;
+        let priceSchema = [],
+          valueObj = {},
+          count = 0;
+        let manMade = [],
+          countIndex = 0;
+        fileFlow.priceLists.map((ele, index) => {
+          if (ele.type == 1) {
+            //人工费
+            manMade.push(ele.partId);
+            count = count + ele.count * ele.price;
+          } else if (ele.type == 2) {
+            //人工费
+            let addName = addSchemas(n.value)
+            priceSchema.push(...addName)
+            valueObj[`deviceTypeId${n.value}`] = ele.name;
+            valueObj[`device_${n.value}`] = Number(ele.price);
+            count = count + Number(ele.price);
+            n.value++
+          } else {
+            //备件
+            countIndex++;
+            let price = ele.discount == 1 ? ele.priceDiscount : ele.price;
+            valueObj[`priceList${ele.priceListId}`] = ele.count || 0;
+            valueObj[`priceListText${ele.priceListId}`] = `${ele.name} ${ele.price} 元/${
+              ele.type == 0 ? ele.partUnit : ''
+            }`;
+            valueObj[`discount${ele.priceListId}`] = ele.discount == 1 ? [0] : [];
+            count = count + ele.count * price;
+            priceSchema.push(
+              {
+                // priceSchema.unshift({
+                field: 'priceListText' + ele.priceListId,
+                component: 'InputNumber',
+                label: countIndex,
+                labelWidth: 40,
+                slot: 'text',
+                // labelWidth:300,
+                // subLabel:"数量",
+                colProps: {
+                  span: Boolean(ele.priceDiscount) ? 8 : 16,
+                },
               },
-              options: [
               {
-                label: `折扣价 ${ele.priceDiscount}元`,
-                value: 0,
+                field: 'discount' + ele.priceListId,
+                component: 'CheckboxGroup',
+                ifShow: Boolean(ele.priceDiscount),
+                componentProps: {
+                  onChange: (val) => {
+                    setTimeout(() => {
+                      updataCount();
+                    }, 100);
+                  },
+                  options: [
+                    {
+                      label: `折扣价 ${ele.priceDiscount}元`,
+                      value: 0,
+                    },
+                  ],
+                },
+                colProps: {
+                  span: 8,
+                },
               },
-            ]
-            },
-            colProps: {
-              span: 8,
-            }
-          },{
-            field: 'priceList' + ele.priceListId,
-            label: '数量',//`${ele.type == 0?'备件':'人工'}:  ${ele.name} ${ele.price} 元/次`,
-            // suffix:'数量',
-            component: 'InputNumber',
-            defaultValue:ele.count || 0,
-            labelWidth:50,
-            // labelWidth:300,
-            // subLabel:"数量",
-            colProps: {
-              span: 8,
-            },
-            required: true,
-            componentProps: {
-              disabled:ele.status == 1,
-              min:0,
-              max:999,
-              maxLength: 15,
-              onChange:(val)=>{
-                setTimeout(() => {
-                updataCount()
-              }, 100)
-              }
-            },
-          })
+              {
+                field: 'priceList' + ele.priceListId,
+                label: '数量', //`${ele.type == 0?'备件':'人工'}:  ${ele.name} ${ele.price} 元/次`,
+                // suffix:'数量',
+                component: 'InputNumber',
+                defaultValue: ele.count || 0,
+                labelWidth: 50,
+                // labelWidth:300,
+                // subLabel:"数量",
+                colProps: {
+                  span: 8,
+                },
+                required: true,
+                componentProps: {
+                  disabled: ele.status == 1,
+                  min: 0,
+                  max: 999,
+                  maxLength: 15,
+                  onChange: (val) => {
+                    setTimeout(() => {
+                      updataCount();
+                    }, 100);
+                  },
+                },
+              },
+            );
           }
-        })
-        fileFlow.priceCount = count.toFixed(2)
-        valueObj.manMade = manMade
-        priceSchema.map(item =>{
-          console.log('priceSchema',item)
-          appendSchemaByField(item,'')
-        })
-        console.log('addPriceItem',valueObj)
-        setTimeout(()=>{
-          setFieldsValue(valueObj)
-        },10)
+        });
+        fileFlow.priceCount = count.toFixed(2);
+        valueObj.manMade = manMade;
+        priceSchema.map((item) => {
+          appendSchemaByField(item, '');
+        });
+        setTimeout(() => {
+          setFieldsValue(valueObj);
+        }, 10);
       }
-      function addSchemas(number){
+      function addSchemas(number) {
+        let priceListsLength = fileFlow.priceLists.filter(ele => ele.type == 0).length;
         let parentList: FormSchema[] = [
           {
             field: 'deviceType' + number,
-            label: '人工',
-            component: 'ApiSelect',
+            label: (number + priceListsLength),
+            labelWidth: 40,
+            component: 'Input',
+            slot: 'text',
+            required: false,
             colProps: {
-              span: 12,
+              span: 3,
             },
-            required: true,
+          },{
+            field: 'deviceTypeId' + number,
+            label: '',
+            labelWidth: 0,
+            component: 'Input',
+            colProps: {
+              span: 8,
+            },
+            rules: [{ required: true }],
             componentProps: {
               api: allList,
               labelField: 'name',
               valueField: 'laborCostId',
-              showSearch:true,
-              onChange:(value)=>{
-                console.log('onchange',value,arguments)
-              }
+              showSearch: true,
+              placeholder: '请输入明细名称',
+              onChange: (value) => {
+                console.log('onchange', value, arguments);
+              },
             },
           },
           {
             field: 'device_' + number,
-            label: '数量',
+            label: '价格',
             component: 'InputNumber',
             required: true,
             defaultValue: 1,
-            labelWidth:50,
+            labelWidth: 80,
             componentProps: {
               max: 999,
-              min:1,
+              min: 1,
+              onChange: () => {
+                setTimeout(() => {
+                  updataCount();
+                }, 100);
+              },
             },
             colProps: {
-              span: 6,
+              span: 7,
             },
-          },{
+          },
+          {
             field: number.toString(),
             component: 'Input',
             label: '',
-            labelWidth:0,
+            labelWidth: 0,
             colProps: {
               span: 6,
             },
             slot: 'del',
-          }
+          },
         ];
-        return parentList
+        return parentList;
       }
       const handleSubmit = async () => {
-        const params = await validate(); 
+        const params = await validate();
         try {
           createConfirm({
-          iconType: 'warning',
-          title: () => h('span', '温馨提示'),
-          content: '确定要提交报价吗?',
-          onOk: async () => {
-            loading.value = true
-            let priceListsparams = []
-            console.log('params',n.value,fileFlow.priceLists) 
-            fileFlow.priceLists.map(ele => {
-              if(ele.type == 1){
-                return
-              }
-              let discount = params[`discount${ele.priceListId}`]?.length?1:0;
-            console.log('discount',discount) 
-              priceListsparams.push({
-                priceListId:ele.priceListId,
-                type:ele.type,
-                laborId:ele.laborId,
-                partId:ele.partId,
-                discount,
-                count:params[`priceList${ele.priceListId}`],
-              })
-            })
-            let manMade = params.manMade
-            fileFlow.manMadeList.map(ele => {
-              if(manMade.includes(ele.laborCostId)){
+            iconType: 'warning',
+            title: () => h('span', '温馨提示'),
+            content: '确定要提交报价吗?',
+            onOk: async () => {
+              loading.value = true;
+              let priceListsparams = [];
+              fileFlow.priceLists.map((ele) => {
+                if (ele.type == 1 || ele.type == 2) {
+                  return;
+                }
+                let discount = params[`discount${ele.priceListId}`]?.length ? 1 : 0;
                 priceListsparams.push({
-                  count:1,
-                  priceListId:ele.priceListId,
-                  laborId:ele.laborCostId,
-                  partId:ele.laborCostId,
-                  type:1,
-                })
+                  priceListId: ele.priceListId,
+                  type: ele.type,
+                  laborId: ele.laborId,
+                  partId: ele.partId,
+                  discount,
+                  count: params[`priceList${ele.priceListId}`],
+                });
+              });
+              let manMade = params.manMade;
+              fileFlow.manMadeList.map((ele) => {
+                if (manMade.includes(ele.laborCostId)) {
+                  priceListsparams.push({
+                    count: 1,
+                    priceListId: ele.priceListId,
+                    laborId: ele.laborCostId,
+                    partId: ele.laborCostId,
+                    type: 1,
+                  });
+                }
+              });
+              for (let index = 1; index < n.value; index++) {
+                if(params[`deviceTypeId${index}`]){
+                  priceListsparams.push({
+                  count: 1,
+                  name: params[`deviceTypeId${index}`],
+                  price : params[`device_${index}`],
+                  type: 2,
+                });
+                }
               }
-            })
-            let res = await addOrUpdatePriceList({
-              repairId:params.repairId,
-              priceLists:priceListsparams,
-            })
-            console.log('res',res)
-            createMessage.success(t('common.optSuccess'));
-            closeModal();
-            emit('update');
-            loading.value = false
-            clearInfo()
-          },
-          onCancel: () => {
-            loading.value = false
-          }
-        });
+              await addOrUpdatePriceList({
+                repairId: params.repairId,
+                convertWarranty: params.convertWarranty ? 1 : 0,
+                priceLists: priceListsparams,
+              });
+              createMessage.success(t('common.optSuccess'));
+              closeModal();
+              emit('update');
+              loading.value = false;
+              clearInfo();
+            },
+            onCancel: () => {
+              loading.value = false;
+            },
+          });
         } catch (error) {
-          loading.value = false
+          loading.value = false;
           console.log('not passing', error);
         }
       };
-      function updataCount(){
-        let fromData = getFieldsValue() ,count = 0
+      function updataCount() {
+        let fromData = getFieldsValue(),
+        // let priceListsLength = fileFlow.priceLists.filter(ele => ele.type == 0).length;
+          count = 0;
         // fileFlow.priceListsPrice
-        console.log('fromData',fromData,fileFlow.priceLists)
-        fileFlow.priceLists.map(ele => {
-          let price = Number(fromData[`discount${ele.priceListId}`]?.length?ele.priceDiscount:ele.price);
-          console.log('count',price, count)
-          if(fromData[`priceList${ele.priceListId}`]){
-            count = count + fromData[`priceList${ele.priceListId}`]*price
+        fileFlow.priceLists.map((ele) => {
+          let price = Number(
+            fromData[`discount${ele.priceListId}`]?.length ? ele.priceDiscount : ele.price,
+          );
+          if (fromData[`priceList${ele.priceListId}`]) {
+            count = count + fromData[`priceList${ele.priceListId}`] * price;
           }
-        })
-        let manMade = fromData.manMade
-        fileFlow.manMadeList.map(ele => {
-          if(manMade?.includes(ele.laborCostId)){
-            count = count + Number(ele.price)
+        });
+        let manMade = fromData.manMade;
+        fileFlow.manMadeList.map((ele) => {
+          if (manMade?.includes(ele.laborCostId)) {
+            count = count + Number(ele.price);
           }
-        })
+        });
         for (let index = 1; index < n.value; index++) {
-          if(fromData[`deviceType${index}`] && fromData[`device_${index}`]){
-            let priceId = fromData[`deviceType${index}`]
-            let fromPrice = fromData[`device_${index}`] * fileFlow.priceListsPrice[priceId]
-            count = count +fromPrice
+          if (fromData[`device_${index}`]) {
+            let fromPrice = fromData[`device_${index}`];
+            count = count + Number(fromPrice);
           }
         }
-        fileFlow.priceCount = count.toFixed(2)
+        fileFlow.priceCount = count.toFixed(2);
       }
 
-      function clearInfo(val){
+      function clearInfo(val) {
         let indexa = n.value;
-        fileFlow.priceCount = 0
-        if(!val){
-          resetFields()
+        fileFlow.priceCount = 0;
+        if (!val) {
+          resetFields();
         }
-        let clearFiled = []
-        fileFlow.priceLists.map(ele =>{
-          clearFiled.push(`priceList${ele.priceListId}`,`priceListText${ele.priceListId}`,`discount${ele.priceListId}`)
-        })
+        let clearFiled = [];
+        fileFlow.priceLists.map((ele) => {
+          clearFiled.push(
+            `priceList${ele.priceListId}`,
+            `priceListText${ele.priceListId}`,
+            `discount${ele.priceListId}`,
+          );
+        });
         for (let index = 1; index < indexa; index++) {
-          clearFiled.push(`deviceType${index}`, `device_${index}`, `${index}`)
+          clearFiled.push(`deviceTypeId${index}`,`deviceType${index}`, `device_${index}`, `${index}`);
         }
         removeSchemaByFiled(clearFiled);
-        n.value = 1
+        n.value = 1;
       }
 
       return {
@@ -434,6 +517,7 @@
         clearInfo,
         updataCount,
         t,
+        n,
         del,
         add,
         updataRepairInfo,
@@ -443,11 +527,11 @@
 </script>
 
 <style lang="less" scoped>
-.priceCount{
-  // padding: 20px 180px;
-  line-height: 32px;
-  .label{
-    display: inline-block;
+  .priceCount {
+    // padding: 20px 180px;
+    line-height: 32px;
+    .label {
+      display: inline-block;
+    }
   }
-}
 </style>

+ 245 - 246
src/views/work/repairsparesList.vue

@@ -4,273 +4,272 @@
       <a-tabs v-model:activeKey="tableType" @change="changeTable">
         <a-tab-pane :key="0" :tab="t('routes.spares.tableType.24')" />
         <a-tab-pane :key="1" :tab="t('routes.spares.tableType.25')" />
-        <a-tab-pane :key="2" :tab="t('routes.spares.tableType.90')" />
-      </a-tabs></template
-    >
+        <a-tab-pane :key="2" :tab="t('routes.spares.tableType.90')" /> </a-tabs
+    ></template>
     <div class="desc-wrap-BasicTable">
-    <BasicTable @register="registerTable">
-      <template #action="{ record }">
-        <TableAction
-          stopButtonPropagation
-          :actions="[
-            {
-              label: '详情',
-              ifShow:getCheckPerm('work_detail'),
-              onClick: handleDetail.bind(null, record),
-            },
-            {
-              label: '备件出库',
-              ifShow: getCheckPerm('repairspares_out') && tableType == 0,
-              onClick: handleRecover.bind(null, record),
-            },
-            {
-              label: '备件回收',
-              ifShow: getCheckPerm('repairspares_in') && tableType == 2,
-              onClick: handleRecover.bind(null, record),
-            },
-          ]"
-        />
-      </template>
-    </BasicTable>
-    <partsListModal @update="reload" @register="registerRecovery" />
-    <!-- ifShow: getCheckPerm('device-out') && !Boolean(record.outType), -->
-  </div>
-</PageWrapper>
+      <BasicTable @register="registerTable">
+        <template #action="{ record }">
+          <TableAction
+            stopButtonPropagation
+            :actions="[
+              {
+                label: '详情',
+                ifShow: getCheckPerm('work_detail'),
+                onClick: handleDetail.bind(null, record),
+              },
+              {
+                label: '备件出库',
+                ifShow: getCheckPerm('repairspares_out') && tableType == 0,
+                onClick: handleRecover.bind(null, record),
+              },
+              {
+                label: '备件回收',
+                ifShow: getCheckPerm('repairspares_in') && tableType == 2,
+                onClick: handleRecover.bind(null, record),
+              },
+            ]"
+          />
+        </template>
+      </BasicTable>
+      <partsListModal @update="reload" @register="registerRecovery" />
+      <!-- ifShow: getCheckPerm('device-out') && !Boolean(record.outType), -->
+    </div>
+  </PageWrapper>
 </template>
 <script lang="ts">
-import { defineComponent, onMounted, ref, onActivated } from 'vue';
-import { PageWrapper } from '/@/components/Page';
-import {
-  BasicTable,
-  useTable,
-  TableAction,
-  BasicColumn,
-  TableImg,
-  FormProps,
-} from '/@/components/Table';
-import { Tabs } from 'ant-design-vue';
-import { operateSceneList } from '/@/api/operate';
-import { useI18n } from '/@/hooks/web/useI18n';
-import { usePermissionStore } from '/@/store/modules/permission';
-import partsListModal from './partsListModal.vue';
-import { useModal } from '/@/components/Modal';
-import { useRouter } from 'vue-router'
-import { supplyOrderList, getByRoleType } from '/@/api/spares';
-export default defineComponent({
-  name:'维修备件管理',
-  components: {
+  import { defineComponent, onMounted, ref, onActivated } from 'vue';
+  import { PageWrapper } from '/@/components/Page';
+  import {
     BasicTable,
+    useTable,
     TableAction,
+    BasicColumn,
     TableImg,
-    partsListModal,
-    PageWrapper,
-    [Tabs.name]: Tabs,
-    [Tabs.TabPane.name]: Tabs.TabPane,
-  },
-  setup() {
-    const { t } = useI18n();
-    const permissionStore = usePermissionStore();
-    const router = useRouter()
-    const { getCheckPerm } = permissionStore;
-    const tableType = ref<Recordable>(0); //0看看 、1看见、2深时
-    onMounted(() => {
-      // console.log(router.currentRoute.value.params.id);
-    });
-    const columns: BasicColumn[] = [
-      {
-        title: '报修日期',
-        dataIndex: 'createTime',
-        width: 180,
-      },
-      {
-        title: '客户名称',
-        dataIndex: 'companyName',
-        width: 80,
-        // customRender: ({ record }) => {
-        //   return t(`routes.equity.operation.${record.operationType || 0}`);
-        // },
-      },
-      {
-        title: '产品类型',
-        dataIndex: 'cameraType',
-        width: 80,
-        customRender: ({ record }) => {
-          return t(`routes.scene.tableType.${record.cameraType}`);
+    FormProps,
+  } from '/@/components/Table';
+  import { Tabs } from 'ant-design-vue';
+  import { operateSceneList } from '/@/api/operate';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { usePermissionStore } from '/@/store/modules/permission';
+  import partsListModal from './partsListModal.vue';
+  import { useModal } from '/@/components/Modal';
+  import { useRouter } from 'vue-router';
+  import { supplyOrderList, getByRoleType } from '/@/api/spares';
+  export default defineComponent({
+    name: '维修备件管理',
+    components: {
+      BasicTable,
+      TableAction,
+      TableImg,
+      partsListModal,
+      PageWrapper,
+      [Tabs.name]: Tabs,
+      [Tabs.TabPane.name]: Tabs.TabPane,
+    },
+    setup() {
+      const { t } = useI18n();
+      const permissionStore = usePermissionStore();
+      const router = useRouter();
+      const { getCheckPerm } = permissionStore;
+      const tableType = ref<Recordable>(0); //0看看 、1看见、2深时
+      onMounted(() => {
+        // console.log(router.currentRoute.value.params.id);
+      });
+      const columns: BasicColumn[] = [
+        {
+          title: '报修日期',
+          dataIndex: 'createTime',
+          width: 180,
         },
-      },
-      {
-        title: '产品SN码',
-        dataIndex: 'cameraSnCode',
-        width: 100,
-      },
-      {
-        title: '接单日期',
-        dataIndex: 'orderReceivingTime',
-        width: 100,
-      },
-      {
-        title: '维修工程师',
-        dataIndex: 'repairManName',
-        width: 100,
-      },
-      {
-        title: '故障分析',
-        dataIndex: 'checkResult',
-        width: 150,
-      },
-      {
-        title: '状态',
-        dataIndex: 'status',
-        width: 100,
-        customRender: ({ record }) => {
-          return t(`routes.spares.tableType.${record.status || 0}`);
+        {
+          title: '客户名称',
+          dataIndex: 'companyName',
+          width: 80,
+          // customRender: ({ record }) => {
+          //   return t(`routes.equity.operation.${record.operationType || 0}`);
+          // },
         },
-      },
-      {
-        title: '工单号',
-        dataIndex: 'repairId',
-        width: 150,
-      },
-      {
-        title: t('common.operating'),
-        dataIndex: 'action',
-        slots: { customRender: 'action' },
-        ifShow: true,
-        fixed: 'right',
-        flag: 'ACTION',
-        width: 120,
-      },
-    ];
-    const searchForm: Partial<FormProps> = {
-      labelWidth: 120,
-      autoAdvancedLine: 1,
-      actionColOptions: {
-        span: 24,
-      },
-      schemas: [
         {
-          field: 'cameraType',
-          component: 'Select',
-          label: '产品类型',
-          colProps: {
-            xl: 7,
-            xxl: 7,
-          },          
-          componentProps: {
-            options: [
-              {
-                label: t('routes.device.type.1'),
-                value: 0,
-                key: '0',
-              },
-              {
-                label: t('routes.device.type.2'),
-                value: 1,
-                key: '1',
-              },
-              {
-                label: t('routes.device.type.3'),
-                value: 2,
-                key: '2',
-              },
-            ],
+          title: '产品类型',
+          dataIndex: 'cameraType',
+          width: 80,
+          customRender: ({ record }) => {
+            return t(`routes.scene.tableType.${record.cameraType}`);
           },
         },
         {
-          field: 'cameraSnCode',
-          component: 'Input',
-          label: t('routes.device.snCode'),
-          colProps: {
-            xl: 7,
-            xxl: 7,
+          title: '产品SN码',
+          dataIndex: 'cameraSnCode',
+          width: 100,
+        },
+        {
+          title: '接单日期',
+          dataIndex: 'orderReceivingTime',
+          width: 100,
+        },
+        {
+          title: '维修工程师',
+          dataIndex: 'repairManName',
+          width: 100,
+        },
+        {
+          title: '故障分析',
+          dataIndex: 'checkResult',
+          width: 150,
+        },
+        {
+          title: '状态',
+          dataIndex: 'status',
+          width: 100,
+          customRender: ({ record }) => {
+            return t(`routes.spares.tableType.${record.status || 0}`);
           },
         },
         {
-          field: 'repairManId',
-          label: '维修工程师',
-          component: 'ApiSelect',
-          componentProps: {
-            api: getByRoleType,
-            numberToString: true,
-            labelField: 'nickName',
-            valueField: 'id',
-            immediate: true,
-            params: {
-              roleType: 3,
+          title: '工单号',
+          dataIndex: 'repairId',
+          width: 150,
+        },
+        {
+          title: t('common.operating'),
+          dataIndex: 'action',
+          slots: { customRender: 'action' },
+          ifShow: true,
+          fixed: 'right',
+          flag: 'ACTION',
+          width: 120,
+        },
+      ];
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 120,
+        autoAdvancedLine: 1,
+        actionColOptions: {
+          span: 24,
+        },
+        schemas: [
+          {
+            field: 'cameraType',
+            component: 'Select',
+            label: '产品类型',
+            colProps: {
+              xl: 7,
+              xxl: 7,
+            },
+            componentProps: {
+              options: [
+                {
+                  label: t('routes.device.type.1'),
+                  value: 0,
+                  key: '0',
+                },
+                {
+                  label: t('routes.device.type.2'),
+                  value: 1,
+                  key: '1',
+                },
+                {
+                  label: t('routes.device.type.3'),
+                  value: 2,
+                  key: '2',
+                },
+              ],
             },
           },
-          colProps: {
-            span: 7,
+          {
+            field: 'cameraSnCode',
+            component: 'Input',
+            label: t('routes.device.snCode'),
+            colProps: {
+              xl: 7,
+              xxl: 7,
+            },
           },
-        },
-        {
-          field: 'repairId',
-          component: 'Input',
-          label: '工单号',
-          colProps: {
-            xl: 7,
-            xxl: 7,
+          {
+            field: 'repairManId',
+            label: '维修工程师',
+            component: 'ApiSelect',
+            componentProps: {
+              api: getByRoleType,
+              numberToString: true,
+              labelField: 'nickName',
+              valueField: 'id',
+              immediate: true,
+              params: {
+                roleType: 3,
+              },
+            },
+            colProps: {
+              span: 7,
+            },
           },
-        }
-      ],
-    };
-    const [registerRecovery, { openModal }] = useModal();
-    const [registerTable, { reload }] = useTable({
-      api: supplyOrderList,
-      columns: columns,
-      useSearchForm: true,
-      searchInfo: { statusParam: tableType },
-      formConfig: searchForm,
-      showTableSetting: true,
-      showIndexColumn: false,
-      fetchSetting: {
-        pageField: 'pageNum',
-        sizeField: 'pageSize',
-        listField: 'list',
-        totalField: 'total',
-      },
-      canResize: false,
-    });
-    onActivated(()=>{
-      reload();
-    })
-    async function handleDetail(record: Recordable) {
-      console.log('record', record);
-      router.push({path:`detail/${record.repairId||'20230215174919387'}`})
-    }
-    async function handleRecover(record: Recordable) {
-      openModal(true, {
-        tableType:tableType.value,
-        ...record,
+          {
+            field: 'repairId',
+            component: 'Input',
+            label: '工单号',
+            colProps: {
+              xl: 7,
+              xxl: 7,
+            },
+          },
+        ],
+      };
+      const [registerRecovery, { openModal }] = useModal();
+      const [registerTable, { reload }] = useTable({
+        api: supplyOrderList,
+        columns: columns,
+        useSearchForm: true,
+        searchInfo: { statusParam: tableType },
+        formConfig: searchForm,
+        showTableSetting: true,
+        showIndexColumn: false,
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },
+        canResize: false,
       });
-    }
-    function handleOrder() {
-      openModal(true);
-    }
-    function changeTable(val: string) {
-      tableType.value = val;
-      reload();
-    }
-    return {
-      registerTable,
-      reload,
-      t,
-      tableType,
-      changeTable,
-      handleOrder,
-      getCheckPerm,
-      handleDetail,
-      handleRecover,
-      registerRecovery,
-    };
-  },
-});
+      onActivated(() => {
+        reload();
+      });
+      async function handleDetail(record: Recordable) {
+        console.log('record', record);
+        router.push({ path: `detail/${record.repairId || '20230215174919387'}` });
+      }
+      async function handleRecover(record: Recordable) {
+        openModal(true, {
+          tableType: tableType.value,
+          ...record,
+        });
+      }
+      function handleOrder() {
+        openModal(true);
+      }
+      function changeTable(val: string) {
+        tableType.value = val;
+        reload();
+      }
+      return {
+        registerTable,
+        reload,
+        t,
+        tableType,
+        changeTable,
+        handleOrder,
+        getCheckPerm,
+        handleDetail,
+        handleRecover,
+        registerRecovery,
+      };
+    },
+  });
 </script>
 <style lang="less" scoped>
-.desc-wrap-BasicTable {
-  background-color: #f0f2f5;
-  .vben-basic-table-form-container {
-    padding: 0;
+  .desc-wrap-BasicTable {
+    background-color: #f0f2f5;
+    .vben-basic-table-form-container {
+      padding: 0;
+    }
   }
-}
 </style>

+ 32 - 1
src/views/work/takingOrdersModel.vue

@@ -55,7 +55,24 @@
           component: 'Input',
           slot: 'text',
           label: '保修届满日期',
+          colProps: {
+            span: 16,
+          },
         },
+        // {
+        //   field: 'convertWarranty',
+        //   component: 'Checkbox',
+        //   labelWidth: 0,
+        //   label: '',
+        //   suffix: '保外转包内',
+        //   componentProps: {
+        //     name: 'wodeces',
+        //     label: 'wodeces',
+        //   },
+        //   colProps: {
+        //     span: 5,
+        //   },
+        // },
         {
           field: 'cameraFaultInfo',
           component: 'InputTextArea',
@@ -71,6 +88,20 @@
           },
         },
         {
+          field: 'cameraFaultInfo',
+          component: 'InputTextArea',
+          label: '附件、附带物品',
+          required: false,
+          componentProps: {
+            maxLength: 500,
+            rows: 3,
+            placeholder: '请填写附件、附带物品',
+          },
+          colProps: {
+            span: 24,
+          },
+        },
+        {
           field: 'imageUrl',
           component: 'Upload',
           label: '相关图片',
@@ -174,7 +205,7 @@
         },
       ];
       const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
-        labelWidth: 100,
+        labelWidth: 110,
         schemas: schemas,
         showActionButtonGroup: false,
         actionColOptions: {