tangning 1 year ago
parent
commit
f62d347932
3 changed files with 251 additions and 72 deletions
  1. 11 0
      src/api/spares/index.ts
  2. 104 72
      src/views/work/followedList.vue
  3. 136 0
      src/views/work/signForModel.vue

+ 11 - 0
src/api/spares/index.ts

@@ -44,6 +44,7 @@ enum Api {
   u8ListList = '/service/sale/repairU8/u8List',
   u8Send = '/service/sale/repairU8/u8Send',
   invoiceRegister = '/service/sale/repairInvoice/invoiceRegister',
+  signFor = '/service/sale/salePersonnel/signFor',
 }
 
 /**
@@ -414,6 +415,16 @@ export const invoiceRegister = (params) =>
     },
   });
 
+export const signFor = (params) =>
+  defHttp.post<detailResult>({
+    url: Api.signFor,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
 export const partInStockLog = (params) =>
   defHttp.post<detailResult>({
     url: Api.partInStockLog,

+ 104 - 72
src/views/work/followedList.vue

@@ -63,9 +63,20 @@
               },
               {
                 label: '开票信息',
-                ifShow: getCheckPerm('work_mark') && record.status > 80 && record.warrantyType != 0 && record.warrantyType != 3 && record.payAmount != 0 && record.invoiceStatus == 0,
+                ifShow:
+                  getCheckPerm('work_mark') &&
+                  record.status > 80 &&
+                  record.warrantyType != 0 &&
+                  record.warrantyType != 3 &&
+                  record.payAmount != 0 &&
+                  record.invoiceStatus == 0,
                 onClick: handleInvoice.bind(null, record),
               },
+              {
+                label: '签收',
+                ifShow: getCheckPerm('work_mark') && record.status == 110,
+                onClick: handleSignFor.bind(null, record),
+              },
             ]"
           />
         </template>
@@ -78,6 +89,7 @@
       <payLogModal @update="reload" @register="registerPayLog" />
       <confirmPriceModal @update="reload" @register="registerConfirmPrice" />
       <invoiceModal @update="reload" @register="registerInvoice" />
+      <signForModel @update="reload" @register="registerSignFor" />
       <!-- ifShow: getCheckPerm('device-out') && !Boolean(record.outType), -->
     </div>
   </PageWrapper>
@@ -105,6 +117,7 @@
   import takingOrdersModel from './takingOrdersModel.vue';
   import remarksModal from '../spares/remarksModal.vue';
   import confirmPriceModal from './confirmPriceModal.vue';
+  import signForModel from './signForModel.vue';
   import { useModal } from '/@/components/Modal';
   import { useRouter } from 'vue-router';
   import { saleOrderList } from '/@/api/spares';
@@ -121,6 +134,7 @@
       payLogModal,
       confirmPriceModal,
       quoteModel,
+      signForModel,
       invoiceModal,
       PageWrapper,
       [Tabs.name]: Tabs,
@@ -135,79 +149,90 @@
       onMounted(() => {
         console.log(1);
       });
-      const columns: BasicColumn[] = [
-        {
-          title: '报修日期',
-          dataIndex: 'createTime',
-          width: 180,
-        },
-        {
-          title: '客户名称',
-          dataIndex: 'companyName',
-          width: 100,
-        },
-        {
-          title: '产品类型',
-          dataIndex: 'cameraType',
-          width: 100,
-          customRender: ({ record }) => {
-            return t(`routes.scene.tableType.${record.cameraType}`);
+      const columns = (val: boolean) => {
+        return [
+          {
+            title: '报修日期',
+            dataIndex: 'createTime',
+            width: 180,
           },
-        },
-        {
-          title: '产品SN码',
-          dataIndex: 'cameraSnCode',
-          width: 120,
-        },
-        {
-          title: '故障描述',
-          dataIndex: 'faultMsg',
-          width: 100,
-        },
-        {
-          title: '送修方式',
-          dataIndex: 'sendType',
-          width: 100,
-          customRender: ({ record }) => {
-            return record.sendType == 0 ? '前台送修' : '快递寄送';
+          {
+            title: '客户名称',
+            dataIndex: 'companyName',
+            width: 100,
           },
-        },
-        {
-          title: '快递单号',
-          dataIndex: 'sendTrackingNum',
-          width: 150,
-        },
-        {
-          title: '状态',
-          dataIndex: 'status',
-          width: 100,
-          customRender: ({ record }) => {
-            return t(`routes.spares.tableType.${record.status || 0}`);
+          {
+            title: '产品类型',
+            dataIndex: 'cameraType',
+            width: 100,
+            customRender: ({ record }) => {
+              return t(`routes.scene.tableType.${record.cameraType}`);
+            },
           },
-        },
-        {
-          title: '工单号',
-          dataIndex: 'repairId',
-          width: 150,
-        },
-        {
-          title: '需要开票',
-          dataIndex: 'invoiceStatus',
-          width: 80,
-          customRender: ({ record }) => {
-            return record.invoiceStatus == 0 ? '否' : '是';
+          {
+            title: '产品SN码',
+            dataIndex: 'cameraSnCode',
+            width: 120,
           },
-        },
-        {
-          title: t('common.operating'),
-          dataIndex: 'action',
-          slots: { customRender: 'action' },
-          ifShow: true,
-          fixed: 'right',
-          flag: 'ACTION',
-          width: 240,
-        },
-      ];
+          {
+            title: '故障描述',
+            dataIndex: 'faultMsg',
+            width: 100,
+          },
+          {
+            title: '送修方式',
+            dataIndex: 'sendType',
+            width: 100,
+            customRender: ({ record }) => {
+              return record.sendType == 0 ? '前台送修' : '快递寄送';
+            },
+          },
+          {
+            title: '快递单号',
+            dataIndex: 'sendTrackingNum',
+            width: 150,
+          },
+          {
+            title: '状态',
+            dataIndex: 'status',
+            width: 100,
+            customRender: ({ record }) => {
+              return t(`routes.spares.tableType.${record.status || 0}`);
+            },
+          },
+          {
+            title: '工单号',
+            dataIndex: 'repairId',
+            width: 150,
+          },
+          {
+            title: '需要开票',
+            dataIndex: 'invoiceStatus',
+            width: 80,
+            customRender: ({ record }) => {
+              return record.invoiceStatus == 0 ? '否' : '是';
+            },
+          },
+          {
+            title: '签收',
+            dataIndex: 'trackingImg',
+            width: 80,
+            ifShow: val,
+            customRender: ({ record }) => {
+              return record.trackingImg && record.trackingImg.length > 0 ? '是' : '否';
+            },
+          },
+          {
+            title: t('common.operating'),
+            dataIndex: 'action',
+            slots: { customRender: 'action' },
+            ifShow: true,
+            fixed: 'right',
+            flag: 'ACTION',
+            width: 240,
+          },
+        ];
+      };
       const searchForm: Partial<FormProps> = {
         labelWidth: 120,
         autoAdvancedLine: 1,
@@ -275,10 +300,11 @@
       const [registerDelivery, { openModal: openDeliveryModal }] = useModal();
       const [registerTakingOrders, { openModal: openTakingOrders }] = useModal();
       const [registerRemarks, { openModal: openRemarksModal }] = useModal();
+      const [registerSignFor, { openModal: openSignForModal }] = useModal();
       const [registerInvoice, { openModal: openInvoiceModal }] = useModal();
-      const [registerTable, { reload }] = useTable({
+      const [registerTable, { reload, setColumns }] = useTable({
         api: saleOrderList,
-        columns: columns,
+        columns: columns(false),
         useSearchForm: true,
         searchInfo: { statusParam: tableType },
         formConfig: searchForm,
@@ -307,6 +333,9 @@
       function handleInvoice(record: Recordable) {
         openInvoiceModal(true, record);
       }
+      function handleSignFor(record: string) {
+        openSignForModal(true, record);
+      }
       function handlePayLog(record: Recordable) {
         openPayLogModal(true, record);
       }
@@ -324,6 +353,7 @@
       }
       function changeTable(val: string) {
         tableType.value = val;
+        setColumns(columns(val == 2));
         reload();
       }
       onActivated(() => {
@@ -337,6 +367,7 @@
         registerRemarks,
         registerPayLog,
         registerInvoice,
+        registerSignFor,
         registerDelivery,
         registerConfirmPrice,
         changeTable,
@@ -352,6 +383,7 @@
         handleRemarks,
         handleInvoice,
         registerQuote,
+        handleSignFor,
         registerRecovery,
       };
     },

+ 136 - 0
src/views/work/signForModel.vue

@@ -0,0 +1,136 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    title="验收凭证"
+    :okText="okText"
+    @cancel="resetFields"
+    @ok="handleSubmit"
+  >
+    <div class="pt-2px pr-3px">
+      <BasicForm @register="registerForm">
+        <template #text="{ model, field }"> {{ model[field] }}{{ fileFlow.type }} </template>
+      </BasicForm>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, nextTick, 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 { signFor } from '/@/api/spares/index';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { uploadApi } from '/@/api/product/index';
+  import { ResultEnum } from '/@/enums/httpEnum';
+
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['update', 'register'],
+    setup(props, { emit }) {
+      const fileFlow = reactive({
+        file: null,
+        type: 2, //2-普通发票,3-专用发票
+      });
+      const okText = ref('发送');
+      const { createMessage } = useMessage();
+      const schemas: FormSchema[] = [
+        {
+          field: 'repairId',
+          component: 'Input',
+          label: '维修单号',
+          slot: 'text',
+        },
+        {
+          field: 'deviceInfo',
+          component: 'Input',
+          label: '设备信息',
+          slot: 'text',
+          colProps: {
+            span: 18,
+          },
+        },
+        {
+          field: 'trackingImg',
+          component: 'Upload',
+          label: '付款凭证',
+          required: true,
+          rules: [{ required: true, message: t('common.uploadMessge') }],
+          itemProps: {
+            validateTrigger: 'onBlur',
+          },
+          componentProps: {
+            api: uploadApi,
+            // fileFlow: true,
+            maxNumber: 6,
+            maxSize: 1000,
+            accept: ['jpeg', 'jpg', 'png'],
+            // afterFetch: function (data) {
+            //   // Reflect.set(data, 'url', data.file);
+            //   fileFlow.file = data.file;
+            //   return data;
+            // },
+          },
+
+          colProps: {
+            span: 22,
+          },
+        },
+      ];
+
+      const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
+        labelWidth: 120,
+        schemas: schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+      onMounted(() => {});
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        data && onDataReceive(data);
+      });
+      function onDataReceive(data) {
+        resetFields();
+        fileFlow.type = data.type;
+        setFieldsValue({
+          ...data,
+          deviceInfo: t(`routes.scene.tableType.${data.cameraType}`) + data.cameraSnCode,
+        });
+      }
+      const handleSubmit = async () => {
+        try {
+          const params = await validate();
+          const apiData = params;
+          console.log('res', apiData, params);
+          await signFor(apiData);
+          closeModal();
+          resetFields();
+          createMessage.success(t('common.optSuccess'));
+          emit('update');
+        } catch (error) {
+          console.log('not passing', error);
+        }
+      };
+      function handleVisibleChange(v) {
+        v && props.userData && nextTick(() => onDataReceive(props.userData));
+      }
+      return {
+        register,
+        registerForm,
+        fileFlow,
+        handleVisibleChange,
+        handleSubmit,
+        addListFunc,
+        resetFields,
+        okText,
+        t,
+      };
+    },
+  });
+</script>