Pārlūkot izejas kodu

feat: 添加功能

tangning 2 gadi atpakaļ
vecāks
revīzija
cc7aead50d

+ 8 - 18
src/api/home/index.ts

@@ -16,10 +16,10 @@ enum Api {
   cameraExport = '/service/sale/order/camera/export',
   downExport = '/service/sale/order/down/export',
   incrementExport = '/service/sale/order/increment/export',
-  workType = '/qjkankan/api/age/report/work',
-  workTrend = '/qjkankan/api/age/report/workTrend',
+  workType = '/service/sale/dataCount/warrantyTypeCount',
+  workTrend = '/service/sale/dataCount/faultCount',
   qjuserTrend = '/qjkankan/api/age/report/userTrend',
-  volumeTrend = '/qjkankan/api/age/report/volumeTrend',
+  volumeTrend = '/service/sale/dataCount/repairAddTrend',
 }
 
 /**
@@ -128,26 +128,16 @@ export const buryPointList = (params: PageParams) =>
   
   export const workType = (params) =>
   defHttp.get<Result>({
-    url: qjurl + Api.workType,
+    url: Api.workType,
     params,
     data: params,
-    headers: {
-      // @ts-ignore
-      appId: 'BDA385EC848C1A425F746869011C8D23',
-      ignoreCancelToken: true,
-    },
   });
     
   export const workTrend = (params) =>
-  defHttp.post<Result>({
-    url: qjurl + Api.workTrend,
+  defHttp.get<Result>({
+    url: Api.workTrend,
     params,
     data: params,
-    headers: {
-      // @ts-ignore
-      appId: 'BDA385EC848C1A425F746869011C8D23',
-      ignoreCancelToken: true,
-    },
   });    
   export const qjuserTrend = (params) =>
   defHttp.post<Result>({
@@ -161,8 +151,8 @@ export const buryPointList = (params: PageParams) =>
     },
   });    
   export const volumeTrend = (params) =>
-  defHttp.post<Result>({
-    url: qjurl + Api.volumeTrend,
+  defHttp.get<Result>({
+    url: Api.volumeTrend,
     params,
     data: params,
     headers: {

+ 24 - 14
src/api/order/index.ts

@@ -16,9 +16,10 @@ enum Api {
   incrementList = '/service/sale/order/increment/list',
   incrementExport = '/service/sale/order/increment/export',
   downList = '/service/sale/order/down/list',
-  downExport = '/service/sale/order/down/export',
-  pageInvoice = '/service/sale/increment/list',
-  exportInvoice = '/service/sale/invoice/export',
+  downExport = '/service/sale/repairInvoice/export',
+  pageInvoice = '/service/sale/repairInvoice/list',
+  pageInvoiceOpen = '/service/sale/repairInvoice/open',
+  exportInvoice = '/service/sale/repairInvoice/export',
   invoiceRegister = '/service/sale/invoice/invoiceRegister',
   getInvoiceRegisterDetail = '/service/sale/invoice/getInvoiceRegisterDetail',
 }
@@ -61,13 +62,13 @@ export const CameraExport = (params: PageParams) =>
   defHttp.downloadFile<FileStream>({
     url: Api.cameraExport,
     params: params,
-    fileName:'相机订单.xlsx',
+    fileName: '相机订单.xlsx',
     // data: params,
     headers: {
       // @ts-ignore
       ignoreCancelToken: true,
     },
-    responseType: 'blob'
+    responseType: 'blob',
   });
 
 /**
@@ -79,12 +80,12 @@ export const IncrementExport = (params: PageParams) =>
     url: Api.incrementExport,
     params: params,
     // data: params,
-    fileName:'权益订单.xlsx',
+    fileName: '权益订单.xlsx',
     headers: {
       // @ts-ignore
       ignoreCancelToken: true,
     },
-    responseType: 'blob'
+    responseType: 'blob',
   });
 
 export const IncrementList = (params: PageParams) =>
@@ -102,13 +103,13 @@ export const DownExport = (params: PageParams) =>
   defHttp.downloadFile<FileStream>({
     url: Api.downExport,
     params: params,
-    fileName:'下载订单.xlsx',
+    fileName: '下载订单.xlsx',
     // data: params,
     headers: {
       // @ts-ignore
       ignoreCancelToken: true,
     },
-    responseType: 'blob'
+    responseType: 'blob',
   });
 
 export const DownList = (params: PageParams) =>
@@ -130,18 +131,27 @@ export const InvoiceList = (params: PageParams) =>
       ignoreCancelToken: true,
     },
   });
+export const InvoiceOpen = (params: PageParams) =>
+  defHttp.post<InvoiceListResul>({
+    url: Api.pageInvoiceOpen,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
 
 export const InvoiceExport = (params: PageParams) =>
   defHttp.downloadFile<FileStream>({
     url: Api.exportInvoice,
-    method:'POST',
+    method: 'GET',
     params,
-    fileName:'发票记录.xlsx',
+    fileName: '发票记录.xlsx',
     headers: {
       // @ts-ignore
       ignoreCancelToken: true,
     },
-    responseType: 'blob'
+    responseType: 'blob',
   });
 
 export const InvoiceDetail = (params: PageParams) =>
@@ -153,7 +163,7 @@ export const InvoiceDetail = (params: PageParams) =>
       ignoreCancelToken: true,
     },
   });
-  //上传文件
+//上传文件
 export function InvoiceRegister(
   params: UploadFileParams,
   onUploadProgress: (progressEvent: ProgressEvent) => void,
@@ -165,4 +175,4 @@ export function InvoiceRegister(
     },
     params,
   );
- }
+}

+ 1 - 1
src/api/spares/index.ts

@@ -23,7 +23,7 @@ enum Api {
   process = '/service/sale/repairInfo/process',//工单流程
   partList = '/service/sale/part/list',//备件列表
   faultAllList = '/service/sale/fault/allList',//故障列表
-  checkRegisterInfo = ' /service/sale/repairPersonnel/checkRegisterInfo',//维修登记,维修完成回显详情
+  checkRegisterInfo = '/service/sale/repairPersonnel/checkRegisterInfo',//维修登记,维修完成回显详情
   checkRegister = '/service/sale/repairPersonnel/checkRegister',//维修登记
   partAllList = '/service/sale/part/allList',//全部备件列表没分页
   partAddOrUpdate = '/service/sale/part/addOrUpdate',//新增设备,修改设备,修改状态

+ 13 - 9
src/views/home/condition.vue

@@ -1,21 +1,21 @@
 <template>
   <div class="condition">
-    <div class="selct" style="display: inline-block" v-if="!typeShow">
+    <div class="selct" style="display: inline-block">
       <!-- <span style="margin-right:15px"></span> -->
       <Select
         v-model:value="type"
-        style="width: 100px; margin-right: 30px"
+        style="width: 100px; margin-right: 15px"
         placeholder="请选择类型"
         :options="typeOptions"
         @change="handleType"
       ></Select>
     </div>
 
-    <div class="selct" style="display: inline-block; margin-right: 15px">
+    <div class="selct" style="display: inline-block; margin-right: 15px;width: 220px;">
       <RangePicker v-model:value="selectTime" @calendarChange="calendarPriceRangeChange" valueFormat="YYYY-MM-DD" :disabled-date="disabledDate" format="YYYY-MM-DD" @change="handleTime"/>
     </div>
 
-    <div class="selct" style="display: inline-block">
+    <div class="selct" style="display: inline-block" v-if="!typeShow">
       <!-- <span style="margin-right:15px">颗粒度</span> -->
       <Select
         v-model:value="value"
@@ -48,7 +48,7 @@ const props = defineProps({
 type RangeValue = [Dayjs, Dayjs];
 const picker = ref('date');
 const type = ref(props.timeType ||'0');
-const value = ref(props.type ||'0');
+const value = ref(props.type ||'2');
 const isUserDate =ref(false);
 const selectPriceDate = ref(dayjs().subtract(6,'month').format('YYYY-MM-DD'))
 const selectTime = ref<RangeValue>([dayjs().subtract(props.selectTimeType == 1 ? 1:6,'month').format('YYYY-MM-DD'), dayjs().format('YYYY-MM-DD')]);
@@ -76,11 +76,15 @@ const disabledDate = (current: Dayjs) => {
 const typeOptions = ref<SelectProps['options']>([
   {
     value: '0',
-    label: props.name && props.name[0] || '新增',
+    label: props.name && props.name[0] || '四维看看',
   },
   {
     value: '1',
-    label: props.name && props.name[1] || '累计',
+    label: props.name && props.name[1] || '四维看见',
+  },
+  {
+    value: '2',
+    label: props.name && props.name[2] || '四维深时',
   },
 ]);
 function calendarPriceRangeChange(date){
@@ -115,8 +119,8 @@ function output(){
   let data = {
     startTime:selectTime.value[0],
     endTime:selectTime.value[1],
-    dataType:value.value,
-    type:type.value,
+    type:value.value,
+    cameraType:type.value,
   }
   emit('change',data)
 }

+ 46 - 82
src/views/home/faultType.vue

@@ -1,20 +1,27 @@
 <template>
-  <Card title="作品类型统计">
+  <Card title="故障类型统计">
     <template #extra>
-      <condition type="2" :typeShow="false"  @change="Search" @expor="expor" />
+      <condition type="2" :typeShow="true" @change="Search" @expor="handleExport" />
     </template>
     <div class="piechart" ref="chartPieRef" :style="{ height: '280px', width: '100%' }"></div>
   </Card>
 </template>
 <script lang="ts" setup>
+import condition from './condition.vue';
 import { Card } from 'ant-design-vue';
-import { ref, Ref, onMounted } from 'vue';
-import { workType } from '/@/api/home/index';
+import { ref, Ref, onMounted, reactive } from 'vue';
+import { exportElsxFile } from '/@/utils/file/download';
+import dayjs from 'dayjs';
+import { workTrend } from '/@/api/home/index';
 import { useECharts } from '/@/hooks/web/useECharts';
 const chartPieRef = ref<HTMLDivElement | null>(null);
 const { setOptions } = useECharts(chartPieRef as Ref<HTMLDivElement>);
 const colorList = ['#38a0ff', '#4cca73', '#FDD56A', '#d58b55', '#c8ffff'];
-let pieData = ref([]);
+let SearchData = reactive({
+  startTime: dayjs().subtract(6, 'month').format('YYYY-MM-DD'),
+  endTime: dayjs().format('YYYY-MM-DD'),
+  cameraType: '0',
+});
 var rich = {
   name: {
     color: '#666666',
@@ -47,59 +54,15 @@ var rich = {
     fontSize: 26,
   },
 };
+let echartData = reactive({
+  ydata: [],
+  xdata: [],
+});
 var ydata = [
   {
     name: '财务管理决策实训',
     value: 18,
   },
-  {
-    name: '商品流通业实训',
-    value: 16,
-  },
-  {
-    name: '暖心陪伴(津乐园20cm定制蛋糕)',
-    value: 15,
-  },
-  {
-    name: '嘉果荟萃(津乐园20cm定制蛋糕)',
-    value: 14,
-  },
-  {
-    name: '优雅圆舞曲(津乐园20cm)',
-    value: 10,
-  },
-  {
-    name: '巧克力之夏(津乐园20cm定制蛋糕)',
-    value: 7.9,
-  },
-  {
-    name: '财税宝4G',
-    value: 6.7,
-  },
-  {
-    name: '成本会计',
-    value: 6,
-  },
-  {
-    name: '纳税会计与筹划',
-    value: 4.5,
-  },
-  {
-    name: '金融担保业实训',
-    value: 3,
-  },
-  {
-    name: '成本会计aaa',
-    value: 6,
-  },
-  {
-    name: '纳税会计与筹划aaa',
-    value: 4.5,
-  },
-  {
-    name: '金融担保业实训aaa',
-    value: 3,
-  },
 ];
 var color = [
   '#8d7fec',
@@ -113,21 +76,7 @@ var color = [
   '#57e7ec',
   '#cf9ef1',
 ];
-var xdata = [
-  '财务管理决策实训',
-  '商品流通业实训',
-  '暖心陪伴(津乐园20cm定制蛋糕)',
-  '嘉果荟萃(津乐园20cm定制蛋糕)',
-  '优雅圆舞曲(津乐园20cm)',
-  '巧克力之夏(津乐园20cm定制蛋糕)',
-  '财税宝4G',
-  '成本会计',
-  '纳税会计与筹划',
-  '金融担保业实训',
-  '成本会计aaa',
-  '纳税会计与筹划aaa',
-  '金融担保业实训aaa',
-];
+var xdata = ['财务管理决策实训'];
 function handlesetOptions() {
   setOptions({
     tooltip: {
@@ -142,7 +91,7 @@ function handlesetOptions() {
       top: 'center',
       left: '60%',
       bottom: '0%',
-      data: xdata,
+      data: echartData.xdata,
       itemWidth: 8,
       itemHeight: 8,
       itemGap: 16,
@@ -192,7 +141,7 @@ function handlesetOptions() {
             },
           },
         },
-        data: ydata,
+        data: echartData.ydata,
       },
     ],
     color: colorList,
@@ -200,25 +149,40 @@ function handlesetOptions() {
   });
 }
 async function getList() {
-  const res = await workType({});
-  let zhStr = {
-    '4dkk': '三维场景', //四维看看作品
-    mix: '综合作品', //   混合作品
-    pano: '全景图', //全景看看作品
+  const res = await workTrend(SearchData);
+  let exdata = [],
+    eydata = [];
+  res.map((ele) => {
+    exdata.push(ele.groupKey2);
+    eydata.push({
+      name: ele.groupKey2,
+      value: ele.count,
+    });
+  });
+  echartData.xdata = exdata;
+  echartData.ydata = eydata;
+  handlesetOptions();
+}
+function Search(val) {
+  SearchData = val;
+  getList();
+}
+function handleExport() {
+  let fields = {
+    time: '保修类型',
+    num: '数量',
   };
-  pieData.value = res.map((ele) => {
+  let data = echartData.ydata.map((ele) => {
     return {
-      ...ele,
-      value: ele.count,
-      name: zhStr[ele.groupKey],
+      time: ele.name,
+      num: ele.value || 0,
     };
   });
-  handlesetOptions();
+  exportElsxFile(data, fields, '故障类型统计');
 }
 
 onMounted(() => {
-  handlesetOptions();
-  // getList();
+  getList();
 });
 </script>
 <style lang="less" scoped>

+ 3 - 53
src/views/home/index.vue

@@ -1,13 +1,10 @@
 <template>
   <div class="p-4">
+    <lineEcharts title="工单趋势统计" class="!my-4 enter-y" />
     <div class="md:flex !my-4 enter-y">
-      <faultType class="md:w-1/2 w-full !md:mt-0 !mt-4 !md:mr-4"></faultType>
-      <pieEchart class="md:w-1/2 w-full !md:mt-0 !mt-4 !md:mr-4"></pieEchart>
-      <!-- <lineEcharts title="管理中心用户活跃度统计" class="md:w-1/2 mx-4 w-full" /> -->
+      <faultType class="md:w-1/2 w-full !md:mt-0 !mt-4 !md:mr-2"></faultType>
+      <pieEchart class="md:w-1/2 w-full !md:mt-0 !mt-4 !md:ml-2"></pieEchart>
     </div>
-    <orderEchart title="作品趋势分析" class="!my-4 enter-y" @change="Search" :echartData="worksData" :loading="loading" />
-    <lineEcharts title="云容量趋势分析" class="!my-4 enter-y" />
-    test
   </div>
 </template>
 <script lang="ts" setup>
@@ -17,56 +14,9 @@ import orderEchart from './orderEchart.vue';
 import pieEchart from './pieEchart.vue'
 import lineEcharts from './lineEcharts.vue';
 import faultType from './faultType.vue'
-const loading = ref(true);
-// const growCardList = ref<GrowCardItem[]>([]);
-const worksData = reactive({
-  xdata:[],
-  downOrder:[],
-  incrementOrder:[],
-  partOrder:[],
-  echartTypr:'bar',
-});
-const SearchData = reactive({
-  startTime: '',
-  endTime: '',
-  timeType: 'month',
-  infoType: 'add',
-});
 onMounted(() => {
   // getData();
   // getList();
 });
-// async function getList() {
-//   let downlist = [], xdata = [], downOrder = [], partOrder = [], incrementOrder = [];
-//   let res =  await workTrend(SearchData);
-//   res = res.reverse()
-//   res.map((ele) => {
-//     xdata.push(ele.groupKey);
-//     // downlist.push(ele.count);
-//     downOrder.push(ele.pano);
-//     partOrder.push(ele.mix);
-//     incrementOrder.push(ele.age);
-//   });
-//   worksData.xdata = xdata
-//   worksData.downOrder = downOrder
-//   worksData.incrementOrder = incrementOrder
-//   worksData.partOrder = partOrder
-// }
-// function Search(val) {
-//   console.log('infoType',val)
-//   const { startTime, endTime, dataType, type } = val;
-//   let timeStr = {
-//       0:'day',
-//       1:'week',
-//       2:'month',
-//     }
-//   SearchData.startTime = startTime;
-//   SearchData.endTime = endTime;
-//   SearchData.infoType = type == '0'?'add':'all';
-//   SearchData.timeType = timeStr[dataType] || 'month'
-//   getList();
-// }
-// async function getData() {
-// }
 </script>
 

+ 16 - 45
src/views/home/lineEcharts.vue

@@ -1,48 +1,29 @@
 <template>
   <Card :title="title" :loading="loading">
     <template #extra>
-      <condition :selectTimeType="title=='管理中心用户活跃度统计'?1:0"  :type="title=='管理中心用户活跃度统计'?'0':'2'"  :typeShow="title=='管理中心用户活跃度统计'" @change="Search"  @expor="handleExport" />
+      <condition @change="Search"  @expor="handleExport" />
     </template>
-      <div ref="chartRef" :style="{ height, width }"></div>
+      <div ref="chartRef" :style="{ height:'280px', width:'100%' }"></div>
   </Card>
 </template>
-<script lang="ts">
-  import { basicProps } from './props';
-  import { Card, Select } from 'ant-design-vue';
-  import type { SelectProps } from 'ant-design-vue';
-</script>
 <script lang="ts" setup>
+  import { Card } from 'ant-design-vue';
   import { ref, Ref, watch, onMounted, reactive } from 'vue';
-  import { volumeTrend, qjuserTrend } from '/@/api/home/index';
+  import { volumeTrend } from '/@/api/home/index';
   import condition from './condition.vue';
   import dayjs from 'dayjs';
   import { useECharts } from '/@/hooks/web/useECharts';
   import { exportElsxFile, } from '/@/utils/file/download';
   const props = defineProps({
   loading: Boolean,
-    ...basicProps,
+  title: String,
   });
-  const value = ref(1);
-  const SearchData = reactive({
-    startTime: dayjs().subtract(props.title == '云容量趋势分析'?6:1,'month').format('YYYY-MM-DD'),
+  let SearchData = reactive({
+    startTime: dayjs().subtract(6,'month').format('YYYY-MM-DD'),
     endTime: dayjs().format('YYYY-MM-DD'),
-    timeType: props.title == '云容量趋势分析'?'month':'day',
-    infoType: props.title == '云容量趋势分析'?'add':'all',
+    type: '2',
+    cameraType: '0',
   });
-  const options = ref<SelectProps['options']>([
-        {
-          value: 1,
-          label: '日',
-        },
-        {
-          value: 2,
-          label: '周',
-        },
-        {
-          value: 3,
-          label: '月',
-        },
-      ]);
   const viewStaticsData = ref<number[]>([]);
   const shareStaticsData = ref<number[]>([]);
   const yixStringData = ref<string[]>([]);
@@ -54,21 +35,11 @@
   });
   function handleChange(val){
     console.log('handleChange',val)
-    SearchData.value = val
+    SearchData = val
     getAddUser()
   }
   function Search(val) {
-    console.log('Search',val)
-    let timeStr = {
-      0:'day',
-      1:'week',
-      2:'month',
-    }
-    const { startTime, endTime, dataType, type } = val;
-    SearchData.timeType = timeStr[dataType] || 'month'
-    SearchData.startTime = startTime;
-    SearchData.endTime = endTime;
-    SearchData.infoType = props.title == '管理中心用户活跃度统计'?'all':type == '0'?'add':'all';
+    SearchData = val;
     getAddUser();
   }
   function handleExport(){
@@ -87,12 +58,12 @@
 }
   async function getAddUser() {
     let xdata = [], yData=[]
-    let apiSrc = props.title=='云容量趋势分析'?volumeTrend:qjuserTrend
+    let apiSrc = volumeTrend
     let res = await apiSrc(SearchData);
     const data = res.reverse()
     data.map(ele => {
-      xdata.push(ele.groupKey)
-      yData.push(ele.count)
+      xdata.unshift(ele.groupKey)
+      yData.unshift(ele.count)
     })
     yixStringData.value = xdata
     viewStaticsData.value = yData
@@ -118,7 +89,7 @@
         data: yixStringData.value,
       },
       yAxis: {
-        name:props.title=='云容量趋势分析'?'容量/G':'',
+        name:'数量',
         type: 'value',
         splitNumber: 4,
       },
@@ -127,7 +98,7 @@
           data: viewStaticsData.value,
           type: 'line',
           itemStyle: { color: '#38a0ff' },
-          name: props.title=='云容量趋势分析'?'容量数':'用户活跃度',
+          name:'数量',
         },
       ],
     });

+ 36 - 54
src/views/home/pieEchart.vue

@@ -1,7 +1,7 @@
 <template>
-  <Card title="作品类型统计">
+  <Card title="保修类型统计">
     <template #extra>
-      <condition :selectTimeType="0"  :typeShow="false" @change="Search"  @expor="handleExport" />
+      <condition :selectTimeType="0"  :typeShow="true" @change="Search"  @expor="handleExport" />
     </template>
     <div class="piechart" ref="chartPieRef" :style="{ height: '280px', width: '100%' }"></div>
   </Card>
@@ -9,13 +9,21 @@
 <script lang="ts" setup>
 import condition from './condition.vue';
 import { Card } from 'ant-design-vue';
-import { ref, Ref, onMounted } from 'vue';
+import { ref, Ref, reactive, onMounted } from 'vue';
 import { workType } from '/@/api/home/index';
 import { useECharts } from '/@/hooks/web/useECharts';
+import { exportElsxFile, } from '/@/utils/file/download';
+import dayjs from 'dayjs';
 const chartPieRef = ref<HTMLDivElement | null>(null);
 const { setOptions } = useECharts(chartPieRef as Ref<HTMLDivElement>);
 const colorList = ['#38a0ff', '#4cca73', '#FDD56A', '#d58b55', '#c8ffff'];
 let pieData = ref([]);
+let legenData = ref([]);
+let SearchData = reactive({
+    startTime: dayjs().subtract(6,'month').format('YYYY-MM-DD'),
+    endTime: dayjs().format('YYYY-MM-DD'),
+    cameraType: '0',
+  });
 var rich = {
   name: {
     color: '#666666',
@@ -57,7 +65,7 @@ function handlesetOptions() {
     legend: {
       orient: 'horizontal',
       bottom: 0,
-      data: ['全景图', '三维场景', '综合作品'],
+      data: legenData.value,
     },
     series: [
       {
@@ -96,61 +104,35 @@ function handlesetOptions() {
   });
 }
 async function getList() {
-  // const res = await workType({});
-  let zhStr = {
-    '4dkk': '三维场景', //四维看看作品
-    mix: '综合作品', //   混合作品
-    pano: '全景图', //全景看看作品
-  };
-  pieData.value = [
-    {
-      name: '三维场景',
-      value: 26,
-    },
-    {
-      name: '综合作品',
-      value: 26,
-    },
-    {
-      name: '全景图',
-      value: 26,
-    },
-  ];
-  // res.map(ele => {
-  //   return {
-  //     ...ele,
-  //     value: ele.count,
-  //     name: zhStr[ele.groupKey],
-  //   }
-  // })
+  const res = await workType(SearchData);
+  let pieDatas = [],legenDatas = [];
+  res.map(ele => {
+    legenDatas.push(ele.groupKey2)
+    pieDatas.push({
+      name: ele.groupKey2,
+      value: ele.count,
+    })
+  })
+  pieData.value = pieDatas
+  legenData.value = legenDatas
   handlesetOptions();
 }
 function Search(val) {
-    // console.log('Search',val)
-    // let timeStr = {
-    //   0:'day',
-    //   1:'week',
-    //   2:'month',
-    // }
-    // const { startTime, endTime, dataType, type } = val;
-    // SearchData.timeType = timeStr[dataType] || 'month'
-    // SearchData.startTime = startTime;
-    // SearchData.endTime = endTime;
-    // SearchData.infoType = props.title == '管理中心用户活跃度统计'?'all':type == '0'?'add':'all';
-    // getAddUser();
+    SearchData = val
+    getList();
   }
   function handleExport(){
-  // let fields  = {
-  //   'time':'日期',
-  //   'num':'数量',
-  // }
-  //   let data = yixStringData.value.map((ele,index) => {
-  //     return {
-  //       'time':ele,
-  //       'num':viewStaticsData.value && viewStaticsData.value[index] || 0,
-  //     }
-  //   })
-  //   exportElsxFile(data, fields,  props.title)
+  let fields  = {
+    'time':'保修类型',
+    'num':'数量',
+  }
+    let data = pieData.value.map((ele) => {
+      return {
+        'time':ele.name,
+        'num':ele.value || 0,
+      }
+    })
+    exportElsxFile(data, fields,  '保修类型统计')
 }
 onMounted(() => {
   getList();

+ 13 - 29
src/views/invoice/EditModal.vue

@@ -48,23 +48,16 @@
       const { createMessage } = useMessage();
       const schemas: FormSchema[] = [
           {
-            field: 'id',
-            component: 'Input',
-            show:false,
-            label: '发票编号',
-            required: true,
-          },
-          {
-            field: 'email',
+            field: 'invoiceImg',
             component: 'Input',
             label: '邮箱',
             slot: 'text',
-            ifShow:fileFlow.type == 2,
+            ifShow:fileFlow.type == 0,
             colProps: {
               span: 24,
             },
           },{
-            field: 'invoiceNum',
+            field: 'invoiceNo',
             component: 'Input',
             label: '发票编号',
             slot: 'text',
@@ -73,28 +66,19 @@
               span: 24,
             },
           },{
-            field: 'invoiceUrl',
+            field: 'invoiceImg',
             component: 'Upload',
             label: '电子发票',
-            ifShow:fileFlow.type == 2,
+            ifShow:fileFlow.type == 0,
             required: true,
             slot: 'img',
             colProps: {
               span: 22,
             },
           },{
-            field: 'invoiceNum',
-            component: 'Input',
-            label: '发票编号',
-            required: true,
-            slot: 'text',
-            colProps: {
-              span: 24,
-            },
-          },{
-            field: 'shipNum',
+            field: 'trackingNum',
             component: 'Input',
-            ifShow:fileFlow.type == 3,
+            ifShow:fileFlow.type == 1,
             slot: 'text',
             label: '快递单号',
             required: true,
@@ -119,16 +103,16 @@
       });
       async function onDataReceive(data) {
         resetFields();
-        let detail = await InvoiceDetail({id:data.id})
-        fileFlow.type = data.type
+        // let detail = await InvoiceDetail({id:data.id})
+        fileFlow.type = data.invoiceType
         setFieldsValue({
           ...data,
-          ...detail,
+          // ...detail,
         });
         updateSchema([
-          {field: 'shipNum',ifShow:fileFlow.type == 3,},
-          {field: 'email',ifShow:fileFlow.type == 2,},
-          {field: 'invoiceUrl',ifShow:fileFlow.type == 2,},
+          {field: 'trackingNum',ifShow:fileFlow.type == 1,},
+          {field: 'invoiceEmail',ifShow:fileFlow.type == 0,},
+          {field: 'invoiceImg',ifShow:fileFlow.type == 0,},
         ])
       }
       const handleSubmit = async () => {

+ 21 - 50
src/views/invoice/InvoiceModal.vue

@@ -23,7 +23,7 @@
   import { BasicModal, useModalInner } from '/@/components/Modal';
   import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
   import { useMessage } from '/@/hooks/web/useMessage';
-  import { InvoiceRegister } from '/@/api/order';
+  import { InvoiceOpen } from '/@/api/order';
   import { useI18n } from '/@/hooks/web/useI18n';
   import { uploadApi } from '/@/api/product/index';
   import { ResultEnum } from '/@/enums/httpEnum';
@@ -45,26 +45,25 @@
       const { createMessage } = useMessage();
       const schemas: FormSchema[] = [
           {
-            field: 'id',
+            field: 'invoiceId',
             component: 'Input',
             show:false,
             label: '发票编号',
-            required: true,
           },
           {
-            field: 'email',
+            field: 'invoiceEmail',
             component: 'Input',
             label: '邮箱',
             slot: 'text',
-            ifShow:fileFlow.type == 2,
+            ifShow:fileFlow.type == 0,
             componentProps: {
               maxLength: 50,
             },
             colProps: {
-              span: 24,
+              span: 18,
             },
           },{
-            field: 'invoiceNum',
+            field: 'invoiceNo',
             component: 'Input',
             label: '发票编号',
             required: true,
@@ -72,13 +71,13 @@
               maxLength: 50,
             },
             colProps: {
-              span: 24,
+              span: 18,
             },
           },{
-            field: 'file',
+            field: 'invoiceImg',
             component: 'Upload',
             label: '电子发票',
-            ifShow:fileFlow.type == 2,
+            ifShow:fileFlow.type == 0,
             required: true,
             rules: [{ required: true, message: t('common.uploadMessge') }],
             itemProps: {
@@ -86,43 +85,25 @@
             },
             componentProps: {
               api: uploadApi,
-              fileFlow:true,
               maxNumber: 1,
               maxSize: 1000,
               accept: ['jpeg','jpg','png'],
-              afterFetch: function (data) {
-                console.log('url',data)
-                // Reflect.set(data, 'url', data.file);
-                fileFlow.file = data.file
-                return data;
-              },
             },
 
             colProps: {
               span: 22,
             },
           },{
-            field: 'invoiceNum',
-            component: 'Input',
-            label: '发票编号',
-            required: true,
-            componentProps: {
-              maxLength: 50,
-            },
-            colProps: {
-              span: 24,
-            },
-          },{
-            field: 'shipNum',
+            field: 'trackingNum',
             component: 'Input',
-            ifShow:fileFlow.type == 3,
+            ifShow:fileFlow.type == 1,
             label: '快递单号',
             componentProps: {
               maxLength: 50,
             },
             required: true,
             colProps: {
-              span: 24,
+              span: 18,
             },
           },
       ];
@@ -142,33 +123,23 @@
       });
       function onDataReceive(data) {
         resetFields();
-        fileFlow.type = data.type
+        fileFlow.type = data.invoiceType
         setFieldsValue(data);
-        okText.value = fileFlow.type == 2?'发送':'确认'
+        okText.value = fileFlow.type == 0?'发送':'确认'
         updateSchema([
-          {field: 'shipNum',ifShow:fileFlow.type == 3,},
-          {field: 'email',ifShow:fileFlow.type == 2,},
-          {field: 'file',ifShow:fileFlow.type == 2,},
+          {field: 'trackingNum',ifShow:fileFlow.type == 1,},
+          {field: 'invoiceEmail',ifShow:fileFlow.type == 0,},
+          {field: 'invoiceImg',ifShow:fileFlow.type == 0,},
         ])
       }
       const handleSubmit = async () => {
         loading.value = true
         try {
           const params = await validate();
-          const apiData = {
-            data:fileFlow.type == 3?{
-              id:params.id,
-              invoiceNum:params.invoiceNum,
-              shipNum:params.shipNum,
-            }:{
-              id:params.id,
-              invoiceNum:params.invoiceNum,
-              file:fileFlow.file,
-            // file:params.file[0],
-            }
-          }
-          console.log('res', apiData,params);
-          await InvoiceRegister(apiData);
+          await InvoiceOpen({
+            ...params,
+            invoiceImg:fileFlow.type == 0?params.invoiceImg[0]:''
+          });
           closeModal();
           resetFields();
           createMessage.success(t('common.optSuccess'));

+ 15 - 15
src/views/invoice/data.tsx

@@ -29,13 +29,13 @@ export const columns: BasicColumn[] = [
   },
   {
     title: '开票申请时间',
-    dataIndex: 'invoiceTime',
+    dataIndex: 'createTime',
     width: 150,
     customRender: ({ record }) => {
       return (
-        record.invoiceTime &&
+        record.createTime &&
         h(Time, {
-          value: record.invoiceTime,
+          value: record.createTime,
           mode: 'datetime',
         })
       );
@@ -43,48 +43,48 @@ export const columns: BasicColumn[] = [
   },
   {
     title: '开票金额',
-    dataIndex: 'money',
+    dataIndex: 'invoiceAmount',
     width: 80,
   },
   {
     title: '开票类型',
-    dataIndex: 'type',
+    dataIndex: 'invoiceType',
     width: 80,
     customRender:({record})=>{
-      if(record.type == 2){
-        return '普通发票'
-      }else{
+      if(record.invoiceType == 1){
         return '专用发票'
+      }else{
+        return '普通发票'
       }
     }
   },
   {
     title: '发票抬头',
-    dataIndex: 'title',
+    dataIndex: 'invoiceHead',
     // slots: { customRender: 'orderType' },
     width: 150,
   },
   {
     title: '纳税人识别号',
-    dataIndex: 'code',
+    dataIndex: 'invoiceNum',
     // slots: { customRender: 'orderStatus' },
     width: 180,
   },
   {
     title: '注册地址',
-    dataIndex: 'organizedAddress',
+    dataIndex: 'address',
     // slots: { customRender: 'orderStatus' },
     width: 180,
   },
   {
     title: '注册电话',
-    dataIndex: 'registerPhone',
+    dataIndex: 'phone',
     // slots: { customRender: 'orderStatus' },
     width: 120,
   },
   {
     title: '开户银行',
-    dataIndex: 'bankName',
+    dataIndex: 'bank',
     // slots: { customRender: 'orderStatus' },
     width: 150,
   },
@@ -120,11 +120,11 @@ export const columns: BasicColumn[] = [
   },
   {
     title: '状态',
-    dataIndex: 'invoiced',
+    dataIndex: 'status',
     // slots: { customRender: 'orderStatus' },
     width: 80,
     customRender:({record})=>{
-      if(record.invoiced == 0){
+      if(record.status == 0){
         return '未开票'
       }else{
         return '已开票'

+ 3 - 3
src/views/invoice/index.vue

@@ -11,18 +11,18 @@
               {
                 label: '开票登记',
                 //icon: 'la:file-invoice-dollar',
-                ifShow:getCheckPerm('invoice-checkin') && record.invoiced==0,
+                ifShow:record.status==0,
                 onClick: handleInvoice.bind(null, record),
               },
               {
                 label: '电子发票',
-                ifShow:record.type == 2 && record.invoiced==1,
+                ifShow:record.invoiceType == 0 && record.status==1,
                 //icon: 'simple-icons:invoiceninja',
                 onClick: headleDetails.bind(null, record),
               },
               {
                 label: '快递单号',
-                ifShow:record.type != 2&& record.invoiced==1,
+                ifShow:record.invoiceType == 1&& record.status==1,
                 //icon: 'icon-park-outline:express-delivery',
                 onClick: headleDetails.bind(null, record),
               },

+ 1 - 1
src/views/spares/index.vue

@@ -207,7 +207,7 @@ export default defineComponent({
     });
     async function handleDetail(record: Recordable) {
       console.log('record', record);
-      router.push({path:`detail/${record.id||'20230215174919387'}`})
+      router.push({path:`detail/${record.repairId||'20230215174919387'}`})
     }
     async function handleRecover(record: Recordable) {
       openModal(true, {

+ 2 - 2
src/views/work/addAccessoryModel.vue

@@ -14,7 +14,7 @@
           {{ model[field] }}
         </template>
         <template #add>
-          <Button @click="add">添加件</Button>
+          <Button @click="add">添加件</Button>
         </template>
         <template #del="{ field }">
           <Button @click="del(field)">删除</Button>
@@ -246,13 +246,13 @@ export default defineComponent({
       return parentList;
     }
     const handleSubmit = async () => {
-      loading.value = true;
       try {
         createConfirm({
           iconType: 'warning',
           title: () => h('span', '温馨提示'),
           content: '确定要添加备件吗?',
           onOk: async () => {
+            loading.value = true;
             const params = await validate();
             let partList = [];
             for (let s = 1; s <= n.value; s++) {

+ 1 - 1
src/views/work/aftermarket.vue

@@ -162,7 +162,7 @@ export default defineComponent({
     });
     async function handleDetail(record: Recordable) {
       console.log('record', record);
-      router.push({path:`detail/${record.id||'20230215174919387'}`})
+      router.push({path:`detail/${record.repairId||'20230215174919387'}`})
     }
     async function handleRecover(record: Recordable) {
       openModal(true, {

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

@@ -14,7 +14,7 @@
           {{ model[field] }}
         </template>
         <template #add>
-          <Button @click="add">添加件</Button>
+          <Button @click="add">添加件</Button>
         </template>
         <template #del="{ field }">
           <Button @click="del(field)">删除</Button>
@@ -260,6 +260,7 @@ export default defineComponent({
             partList.push({
               partId: params[`partId${s}`],
               partCount: params[`partCount${s}`],
+              type:0,
             });
           }
         }

+ 48 - 31
src/views/work/detail.vue

@@ -18,15 +18,15 @@
             <DescriptionsItem label="产品SN码" v-if="detailData.repairerVo"> {{ detailData.repairerVo.cameraSnCode }} </DescriptionsItem>
             <DescriptionsItem label="保修届满日期"> {{ detailData.orderReceivingVo.warrantyExpirationDate }} </DescriptionsItem>
             <DescriptionsItem label="报修日期" > {{ detailData.repairerVo?.createTime }} </DescriptionsItem>
-            <DescriptionsItem label="送修方式" v-if="detailData.customerAddress"> {{ detailData.customerAddress.sendType?'前台送修':'快递寄送' }} </DescriptionsItem>
-            <DescriptionsItem label="保修类型"> {{ detailData.customerAddress.warrantyType == 0?'保修期内':detailData.customerAddress.warrantyType == 1?'保修期外':'非保修项目' }} </DescriptionsItem>
+            <DescriptionsItem class="ellipsis" label="送修方式" v-if="detailData.customerAddress"> {{ detailData.customerAddress.sendType?'前台送修':`快递寄送:${detailData.customerAddress?.getTrackingNum}` }} </DescriptionsItem>
+            <DescriptionsItem label="保修类型"> {{ detailData.orderReceivingVo.warrantyType == 0?'保修期内':detailData.orderReceivingVo.warrantyType == 1?'保修期外':'非保修项目' }} </DescriptionsItem>
             <DescriptionsItem label="维修单号"> {{ detailData.orderReceivingVo.repairId }} </DescriptionsItem>
             <DescriptionsItem label="上次维修单号" :span="2"> {{ detailData.orderReceivingVo.repairerId }} </DescriptionsItem>
             <DescriptionsItem label="故障描述" :span="3">
               <div>
                 <p>{{ detailData.repairerVo.faultMsg }}</p>
                 <ImagePreviewGroup>
-                  <Image :width="80" v-for="item in detailData.repairerVo.faultImg" :key="item" :src="item"></Image>
+                  <Image :width="80" :height="80" v-for="item in detailData.repairerVo.faultImg" :key="item" :src="item"></Image>
                 </ImagePreviewGroup>
               </div> 
             </DescriptionsItem>
@@ -44,15 +44,15 @@
               <div>
                 <p>{{detailData.repairRegisterVo.checkResult}}</p>
                 <ImagePreviewGroup>
-                  <Image :width="80" v-for="item in detailData.repairRegisterVo.checkImg" :key="item" :src="item"></Image>
+                  <Image :width="80" :height="80" v-for="item in detailData.repairRegisterVo.checkImg" :key="item" :src="item"></Image>
                 </ImagePreviewGroup>
               </div> 
             </DescriptionsItem>
             <DescriptionsItem label="检测日期"> {{ detailData.repairRegisterVo?.createTime }} </DescriptionsItem>
-            <DescriptionsItem label="所需备件"> {{ detailData.orderReceivingVo?.shipMobile }} </DescriptionsItem>
+            <DescriptionsItem label="所需备件"> {{ detailData.repairRegisterVo?.partNamesStr }} </DescriptionsItem>
           </Descriptions>
           <Descriptions title="维修清单" :column="3" layout="vertical">
-            <DescriptionsItem label="备件信息" :span="3">
+            <DescriptionsItem label="备件信息" :span="3" >
               <BasicTable @register="registerTable"></BasicTable>
             </DescriptionsItem>
           </Descriptions>
@@ -60,17 +60,17 @@
             <DescriptionsItem label="维修工程师"> {{ detailData.repairRegisterVo?.sysUserName }}</DescriptionsItem>
             <DescriptionsItem label="维修完成日期"> {{ detailData.repairRegisterVo?.overTime }} </DescriptionsItem>
             <DescriptionsItem label="维修记录"> {{ detailData.repairRegisterVo?.remark }} </DescriptionsItem>
-            <DescriptionsItem label="测试工程师"> {{ detailData.RepairTestVo?.sysUserName }} </DescriptionsItem>
-            <DescriptionsItem label="测试通过时间" :span="2"> {{ detailData.repairRegisterVo?.passTime }} </DescriptionsItem>
+            <DescriptionsItem label="测试工程师"> {{ detailData.repairTestVo?.sysUserName }} </DescriptionsItem>
+            <DescriptionsItem label="测试通过时间" :span="2"> {{ detailData.repairTestVo?.passTime }} </DescriptionsItem>
             <DescriptionsItem label="支付方式" :span="3"> 
               <div v-if="detailData.repairPay">
                 <p>{{ detailData.repairPay.payType==1?'微信':detailData.repairPay.payType==2?'支付宝':'银行' }}</p>
                 <ImagePreviewGroup>
-                  <Image :width="80" v-for="item in [detailData.repairPay.payImg]" :key="item" :src="item"></Image>
+                  <Image :width="80" :height="80" v-for="item in [detailData.repairPay.payImg]" :key="item" :src="item"></Image>
                 </ImagePreviewGroup>
               </div> 
             </DescriptionsItem>
-            <DescriptionsItem label="取回方式" v-if="detailData.customerAddress"> {{detailData.customerAddress.getType==0?'前台取回':`快递寄回 ${detailData.customerAddress.getTrackingNum}`}}</DescriptionsItem>
+            <DescriptionsItem label="取回方式" v-if="detailData.customerAddress"> {{detailData.customerAddress.getType==0?'前台取回':`快递寄回 ${detailData.customerAddress?.getTrackingNum || ''}`}}</DescriptionsItem>
             <DescriptionsItem label="收件信息" :span="2" v-if="detailData.customerAddress"> {{detailData.customerAddress.getAddrName}} {{ detailData.customerAddress.getAddrName }}{{ detailData.customerAddress.getAddress }} </DescriptionsItem>
           </Descriptions>
           <!-- <Descriptions title="单据下载" :column="3">
@@ -109,11 +109,11 @@
               <div class="itemText" v-if="item.customerAddress">{{ item.customerAddress.getType==0?'前台取回':`快递寄回  ${item.customerAddress.getTrackingNum}`}}</div>
               <div class="itemText" v-if="item.customerAddress">{{ item.customerAddress.sendType==0?'前台送修':`快递寄送  ${item.customerAddress.sendTrackingNum}`}}</div>
               <div class="itemText" v-if="item.repairRegisterVo">检测结论: {{ item.repairRegisterVo.checkResult}}</div>
-              <div class="itemText">所需备件: 镜头x2、电池x1</div>
+              <div class="itemText" v-if="item.repairRegisterVo">所需备件: {{ item.repairRegisterVo.partNamesStr }}</div>
               <div class="itemText" v-if="item.orderReceivingVo">机器外观: {{ item.orderReceivingVo.orderFaultMsg}}</div>
               <div class="iamgeList">
                 <ImagePreviewGroup>
-                  <Image :width="80" v-for="item in [logo]" :key="item" :src="item"></Image>
+                  <Image :width="80" :height="80" v-for="itemSrc in item.imagesInfo" :key="itemSrc" :src="itemSrc"></Image>
                 </ImagePreviewGroup>
               </div>
             </div>
@@ -160,7 +160,6 @@ import checkModel from './checkModel.vue';
 import partsListModal from './partsListModal.vue';
 import outModal from './outModal.vue';
 import addAccessoryModel from './addAccessoryModel.vue';
-import logo from '/@/assets/images/grey-logo.png';
 import { BasicTable, useTable, BasicColumn, TableImg, } from '/@/components/Table';
 import { Timeline, TimelineItem, Descriptions, DescriptionsItem, Image, ImagePreviewGroup } from 'ant-design-vue';
 import { cloneDeep } from 'lodash-es';
@@ -205,23 +204,6 @@ const columns: BasicColumn[] = [
   },
 ]
 async function getData() {
-  let res = await detail({repairId:repairId.value})
-  detailData.value = res
-  let countItem = {
-    id:3,
-    price:null,
-    name:'',
-    count:'合计(元)',
-    total:0
-  }
-  dataSource = res.priceList.map(ele => {
-    countItem.total = countItem.total + ele.price * ele.count
-    return {
-      ...ele,
-      total:ele.price * ele.count
-    }
-  })
-  setTableData(cloneDeep([...dataSource,countItem]));
   const stepRes = await process({repairId:repairId.value})
   let butTypeList = {
     0:['接单',],
@@ -238,7 +220,30 @@ async function getData() {
   }
   butList.value = stepRes[0]?butTypeList[stepRes[0].repairStatus || 0]:['接单']
   stepList.value = stepRes
-  console.log('repairId',dataSource,stepRes, butList.value)
+  let res = await detail({repairId:repairId.value})
+  detailData.value = res
+  let countItem = {
+    id:3,
+    price:null,
+    name:'',
+    count:'合计(元)',
+    total:0
+  }
+  dataSource = res.priceList.map(ele => {
+    countItem.total = countItem.total + (ele.price * ele.count)
+    return {
+      // ...ele,
+      count:ele.count,
+      name:ele.name,
+      price:ele.price,
+      id:ele.laborId,
+      total:ele.price * ele.count
+    }
+  })
+  console.log('id',dataSource)
+  if(countItem.total){
+    setTableData(cloneDeep([...dataSource,countItem]));
+  }
 }
 function goBack() {
   router.go(-1);
@@ -324,5 +329,17 @@ const [registerTable, { setTableData }] = useTable({
       margin: 20px;
     }
   }
+
+}
+</style>
+<style lang="less">
+.detailPage {
+  .ellipsis{
+    // .ant-descriptions-item-container{
+    //   overflow: hidden;
+    //   white-space: nowrap;
+    //   text-overflow: ellipsis;
+    // }
+  }
 }
 </style>

+ 2 - 2
src/views/work/followedList.vue

@@ -33,7 +33,7 @@
             {
               label: '修改报价',
               ifShow:record.status == 3,
-              onClick: handleRecover.bind(null, record),
+              onClick: handleQuote.bind(null, record),
             },
             {
               label: '付款登记',
@@ -252,7 +252,7 @@ export default defineComponent({
     });
     async function handleDetail(record: Recordable) {
       console.log('record', record);
-      router.push({path:`detail/${record.id||'20230215174919387'}`})
+      router.push({path:`detail/${record.repairId||'20230215174919387'}`})
     }
     async function handleRecover(record: Recordable) {
       openTakingOrders(true, {

+ 3 - 3
src/views/work/maintenance.vue

@@ -19,7 +19,7 @@
             },
             {
               label: '添加备件',
-              ifShow:tableType == 1,
+              ifShow:tableType == 1 && record.status != 6,
               onClick: handleAdd.bind(null, record),
             },
             {
@@ -137,7 +137,7 @@ export default defineComponent({
       {
         title: '工单号',
         dataIndex: 'repairId',
-        width: 100,
+        width: 150,
       },
       {
         title: t('common.operating'),
@@ -208,7 +208,7 @@ export default defineComponent({
     });
     async function handleDetail(record: Recordable) {
       console.log('record', record);
-      router.push({path:`detail/${record.id||'20230215174919387'}`})
+      router.push({path:`detail/${record.repairId||'20230215174919387'}`})
     }
     async function handleRecover(record: Recordable) {
       openModal(true, record);

+ 6 - 5
src/views/work/outModal.vue

@@ -14,7 +14,7 @@
           {{ model[field] }}
         </template>
         <template #add>
-          <Button @click="add">添加件</Button>
+          <Button @click="add">添加件</Button>
         </template>
         <template #del="{ field }">
           <Button @click="del(field)">删除</Button>
@@ -35,6 +35,7 @@ import {
   checkRegister,
   checkRegisterInfo,
   partInfo,
+  checkRegisterInfo,
   repairOver,
 } from '/@/api/spares';
 import { useI18n } from '/@/hooks/web/useI18n';
@@ -111,7 +112,7 @@ export default defineComponent({
       {
         title: '备件编号',
         dataIndex: 'partId',
-        width: 80,
+        width: 50,
       },
       {
         title: '备件名称',
@@ -121,11 +122,11 @@ export default defineComponent({
       {
         title: '数量',
         dataIndex: 'partCount',
-        width: 80,
+        width: 50,
       },
     ];
     const [registerTable, { reload }] = useTable({
-      api:partInfo,
+      api:checkRegisterInfo,
       columns: columns,
       searchInfo: { repairId: repairId },
       showTableSetting: true,
@@ -258,13 +259,13 @@ export default defineComponent({
       return parentList;
     }
     const handleSubmit = async () => {
-      loading.value = true;
       try {
         createConfirm({
           iconType: 'warning',
           title: () => h('span', '温馨提示'),
           content: '确定要完成维修吗?',
           onOk: async () => {
+            loading.value = true;
             const params = await validate();
             await repairOver(params);
             loading.value = false;

+ 3 - 1
src/views/work/partsListModal.vue

@@ -32,6 +32,7 @@ export default defineComponent({
   emits: ['reload'],
   setup(_, { emit }) {
     const repairId = ref('')
+    const type = ref(0)
     const modelRef = ref({
       title:'设备入库',
       repairId:'0000123',
@@ -54,7 +55,7 @@ export default defineComponent({
     ]
     const [registerTable, { reload }] = useTable({
       api: partInfo,
-      searchInfo: {repairId:repairId},
+      searchInfo: {repairId:repairId,type:type},
       immediate:false,
       pagination:false,
       columns,
@@ -68,6 +69,7 @@ export default defineComponent({
     });
 
     function onDataReceive(data) {
+      type.value = data.status == 5?0:1
       modelRef.value.title = data.status == 5?'备件出库':'备件回收';
       repairId.value = data.repairId
       modelRef.value.repairId = data.repairId;

+ 1 - 1
src/views/work/payLogModal.vue

@@ -125,7 +125,7 @@
         createConfirm({
           iconType: 'warning',
           title: () => h('span', '温馨提示'),
-          content: '删除设备后需要重新入库<br/>确定删除吗?',
+          content: '确定提交付款登记吗?',
           onOk: async () => {
             loading.value = true
             try {

+ 1 - 1
src/views/work/query.vue

@@ -378,7 +378,7 @@ export default defineComponent({
     });
     async function handleDetail(record: Recordable) {
       console.log('record', record);
-      router.push({path:`detail/${record.id||'20230215174919387'}`})
+      router.push({path:`detail/${record.repairId||'20230215174919387'}`})
     }
     async function handleRecover(record: Recordable) {
       openModal(true, {

+ 94 - 26
src/views/work/quoteModel.vue

@@ -14,15 +14,21 @@
           {{ model[field] }}
         </template>
         <template #add>
-          <Button  @click="add" style="margin-left:20px">添加人工</Button>
+          <div>
+            <Button  @click="add" style="margin-left:20px">添加人工</Button>
+            <Button  @click="updataRepairInfo" style="margin-left:20px">重置</Button>
+          </div>
         </template> 
         <template #del="{ field }">
           <Button @click="del(field)">删除</Button>
         </template>
+        <template #delList="{ field }">
+          <Button @click="del(field)">删除</Button>
+        </template>
       </BasicForm>
       <div class="priceCount">
-        <Button  @click="updataCount">更新总价</Button>
-        <div class="label" v-if="fileFlow.priceCount">总价:{{ fileFlow.priceCount }}</div>
+        <span>合计:</span>
+        <div class="label">总价:{{ fileFlow.priceCount || 0 }}元 <Button :preIcon="'outline-refresh'"  @click="updataCount"><RedoOutlined /></Button></div>
       </div>
     </div>
   </BasicModal>
@@ -35,10 +41,10 @@
   import { getPriceList, checkRegisterInfo, addOrUpdatePriceList, allList } from '/@/api/spares'
   import { useI18n } from '/@/hooks/web/useI18n';
   import { uploadApi } from '/@/api/product/index';
-
+  import { RedoOutlined, } from '@ant-design/icons-vue';
   const { t } = useI18n();
   export default defineComponent({
-    components: { BasicModal, BasicForm },
+    components: { BasicModal, BasicForm, RedoOutlined },
     props: {
       userData: { type: Object },
     },
@@ -79,7 +85,7 @@
               span: 18,
             },
           },{
-            field: 'noteContent',
+            field: 'checkResult',
             component: 'Input',
             label: '检测结果',
             slot: 'text',
@@ -99,7 +105,8 @@
       ];
 
       const [registerForm, { validate, getFieldsValue, resetFields, setFieldsValue, removeSchemaByFiled, appendSchemaByField, updateSchema }] = useForm({
-        labelWidth: 180,
+        labelWidth: 100,
+        labelAlign:'left',
         schemas:schemas,
         showActionButtonGroup: false,
         actionColOptions: {
@@ -118,6 +125,20 @@
       const [register, { closeModal }] = useModalInner((data) => {
         data && onDataReceive(data);
       });
+      async function updataRepairInfo() {
+        let { repairId } = getFieldsValue()
+        console.log('20230228171427939',repairId)
+        const { priceLists, count } = await getPriceList({repairId})//
+        updateSchema({
+          field:'0',
+          label:`第${count || 1}次报价`,
+        })
+        addPriceItem(priceLists)
+        clearInfo(true)
+        setTimeout(() => {
+          updataCount()
+        }, 100);
+      }
       async function onDataReceive(data) {
 
         const { priceLists, count } = await getPriceList({repairId:data.repairId})//
@@ -135,7 +156,7 @@
       }
       function del(field) {
         removeSchemaByFiled([`deviceType${field}`, `device_${field}`, `${field}`]);
-        n.value--;
+        // n.value--;
       }
       function add() {
         let list = addSchemas(n.value);
@@ -145,42 +166,62 @@
         n.value++
       }
       function addPriceItem(list){
-        fileFlow.priceLists = list
-        let priceSchema = []
-        let valueObj = {}
+        fileFlow.priceLists = list.reverse()
+        let priceSchema = [],valueObj = {},count=0
         list.map(ele => {
           valueObj[`priceList${ele.priceListId}`] = ele.count || 1
+          valueObj[`priceListText${ele.priceListId}`] = `${ele.name} ${ele.price} 元/次`
+          count = count + ele.count*ele.price
           priceSchema.unshift({
+            field: 'priceListText' + ele.priceListId,
+            component: 'InputNumber',
+            label: ele.type == 0?'备件':'人工',
+            slot: 'text',
+            // labelWidth:300,
+            // subLabel:"数量",
+            colProps: {
+              span: 12,
+            }
+          },{
             field: 'priceList' + ele.priceListId,
-            label: ele.name+'次数',
+            label: '数量',//`${ele.type == 0?'备件':'人工'}:  ${ele.name} ${ele.price} 元/次`,
+            // suffix:'数量',
             component: 'InputNumber',
             defaultValue:ele.count || 1,
-            suffix:ele.price+"元/次",
+            // labelWidth:300,
+            // subLabel:"数量",
             colProps: {
-              span: 13,
+              span: 12,
             },
             required: true,
             componentProps: {
               disabled:ele.status == 1,
-              min:1,
+              min:0,
               max:999,
               maxLength: 15,
+              onChange:(val)=>{
+                setTimeout(() => {
+                updataCount()
+              }, 100)
+              }
             },
           })
         })
+        fileFlow.priceCount = count
         priceSchema.map(item =>{
           console.log('priceSchema',item)
           appendSchemaByField(item,'')
         })
+        console.log('addPriceItem',valueObj)
         setTimeout(()=>{
           setFieldsValue(valueObj)
-        },100)
+        },10)
       }
       function addSchemas(number){
         let parentList: FormSchema[] = [
           {
             field: 'deviceType' + number,
-            label: '人工'+ number,
+            label: '人工',
             component: 'ApiSelect',
             colProps: {
               span: 12,
@@ -224,15 +265,39 @@
         return parentList
       }
       const handleSubmit = async () => {
-        loading.value = true
+        const params = await validate(); 
         try {
           createConfirm({
           iconType: 'warning',
           title: () => h('span', '温馨提示'),
-          content: '确定要提交检测报告吗?',
+          content: '确定要提交报价吗?',
           onOk: async () => {
-            const params = await validate();
-            await cameraIn(params)
+            loading.value = true
+            let priceListsparams = []
+            console.log('addOrUpdatePriceList',params,fileFlow.priceLists) 
+            fileFlow.priceLists.map(ele => {
+              priceListsparams.push({
+                type:ele.type,
+                laborId:ele.laborId,
+                partId:ele.partId,
+                count:params[`priceList${ele.priceListId}`]
+              })
+            })
+            for (let index = 1; index < n.value; index++) {
+              if(params[`device_${index}`]){
+                priceListsparams.push({
+                  // priceListId:params[`deviceType${index}`],
+                  count:params[`device_${index}`],
+                  laborId:params[`deviceType${index}`],
+                  partId:params[`deviceType${index}`],
+                  type:1,
+                })
+              }
+            }
+            await addOrUpdatePriceList({
+              repairId:params.repairId,
+              priceLists:priceListsparams,
+            })
             createMessage.success(t('common.optSuccess'));
             closeModal();
             emit('update');
@@ -247,7 +312,8 @@
       };
       function updataCount(){
         let fromData = getFieldsValue() ,count = 0
-        fileFlow.priceListsPrice
+        // fileFlow.priceListsPrice
+        console.log('fromData',fromData)
         fileFlow.priceLists.map(ele => {
           count = count + fromData[`priceList${ele.priceListId}`]*ele.price
         })
@@ -259,16 +325,17 @@
           }
         }
         fileFlow.priceCount = count
-        console.log('fromData',fromData)
       }
 
-      function clearInfo(){
+      function clearInfo(val){
         let indexa = n.value;
         fileFlow.priceCount = 0
-        resetFields()
+        if(!val){
+          resetFields()
+        }
         let clearFiled = []
         fileFlow.priceLists.map(ele =>{
-          clearFiled.push(`priceList${ele.priceListId}`)
+          clearFiled.push(`priceList${ele.priceListId}`,`priceListText${ele.priceListId}`)
         })
         for (let index = 1; index < indexa; index++) {
           clearFiled.push(`deviceType${index}`, `device_${index}`, `${index}`)
@@ -290,6 +357,7 @@
         t,
         del,
         add,
+        updataRepairInfo,
       };
     },
   });

+ 1 - 4
src/views/work/recoveryModal.vue

@@ -331,10 +331,7 @@ export default defineComponent({
       //   content: '删除设备后需要重新入库<br/>确定删除吗?',
       //   onOk: async () => {
           const params = await validate()
-          const res = await recording({
-            ...params,
-            faultImg:params.faultImg?params.faultImg.toString():[]
-          });
+          const res = await recording(params);
           console.log('validate',params,res)
           createMessage.success(t('common.optSuccess'));
           closeModal();

+ 2 - 2
src/views/work/repairsparesList.vue

@@ -130,7 +130,7 @@ export default defineComponent({
       {
         title: '工单号',
         dataIndex: 'repairId',
-        width: 100,
+        width: 150,
       },
       {
         title: t('common.operating'),
@@ -212,7 +212,7 @@ export default defineComponent({
     });
     async function handleDetail(record: Recordable) {
       console.log('record', record);
-      router.push({path:`detail/${record.id||'20230215174919387'}`})
+      router.push({path:`detail/${record.repairId||'20230215174919387'}`})
     }
     async function handleRecover(record: Recordable) {
       openModal(true, {

+ 4 - 4
src/views/work/testList.vue

@@ -8,9 +8,9 @@
     >
     <div class="desc-wrap-BasicTable">
     <BasicTable @register="registerTable">
-      <template #toolbar>
+      <!-- <template #toolbar>
         <a-button type="primary" @click="handleOrder" v-if="getCheckPerm('invoice-export')"> 录单</a-button>
-      </template>
+      </template> -->
       <template #action="{ record }">
         <TableAction
           stopButtonPropagation
@@ -129,7 +129,7 @@ export default defineComponent({
       {
         title: '工单号',
         dataIndex: 'repairId',
-        width: 100,
+        width: 150,
       },
       {
         title: t('common.operating'),
@@ -211,7 +211,7 @@ export default defineComponent({
     });
     async function handleDetail(record: Recordable) {
       console.log('record', record);
-      router.push({path:`detail/${record.id||'20230215174919387'}`})
+      router.push({path:`detail/${record.repairId||'20230215174919387'}`})
     }
     async function handleRecover(record: Recordable) {
       openModal(true, {