소스 검색

Merge branch 'master' of http://192.168.101.4:3000/jiaxiaoqiang/JG-ADMIN-TEMP

jiaxiaoqiang 1 년 전
부모
커밋
80c0579d46

Dockerfile → docker/Dockerfile


+ 34 - 0
src/api/report/index.ts

@@ -0,0 +1,34 @@
+import request from "@/utils/request";
+//每日完工入库Echart图表
+export function getEchartData(data: string) {
+  return request({
+    url: "/api/v1/process/census/completeOrder/list",
+    method: "post",
+    data,
+  });
+}
+//节拍时间段内数据获取
+export function getBeatInfo(data: string) {
+  return request({
+    url: "/api/v1/process/census/beatInfo/page",
+    method: "post",
+    data,
+  });
+}
+
+//工序每日完成chart数据列表获取
+export function getOperationList(data: string) {
+  return request({
+    url: "/api/v1/process/census/operationList/list",
+    method: "post",
+    data,
+  });
+}
+//工序每日完成chart详情数据获取
+export function getOperationInfo(data: string) {
+  return request({
+    url: "/api/v1/process/census/completeOperation/list",
+    method: "post",
+    data,
+  });
+}

+ 79 - 156
src/views/base/materials/columns.ts

@@ -1,81 +1,49 @@
 import { useDictionaryStoreHook } from "@/store";
 const { dicts } = useDictionaryStoreHook();
-
 export const columns = [
-  {
-    label: "物料编码",
-    prop: "materialCode",
-    width: 130,
-    overHidden: true,
-    search: true,
-    rules: [
-      {
-        required: true,
-        editDisabled: false,
-        message: "请填写物料编码",
-        trigger: "blur",
-      },
-    ],
-  },
-  {
-    label: "物料名称",
-    prop: "materialName",
-    width: 140,
-    overHidden: true,
-    search: true,
-    rules: [
-      {
-        required: true,
-        message: "请填写物料名称",
-        trigger: "blur",
-      },
-    ],
-  },
+  { label: "物料编码", prop: "materialCode", width: 130,overHidden: true,search: true ,rules: [{
+      required: true,
+      editDisabled:false,
+      message: "请填写物料编码",
+      trigger: "blur"
+    }],},
+  { label: "物料名称", prop: "materialName", width: 140,overHidden: true,search: true ,rules: [{
+      required: true,
+      message: "请填写物料名称",
+      trigger: "blur"
+    }],},
   {
     label: "物料属性",
     prop: "attributeDictValue",
     search: true,
     filterable: true,
-    type: "select",
-    width: 100,
-    overHidden: true,
-    dicData: dicts.material_properties,
+    type: 'select',
+    width: 100,overHidden: true,
+    dicData:dicts.material_properties,
     props: { label: "dictLabel", value: "dictValue" },
-    rules: [
-      {
-        required: true,
-        message: "请选择物料属性",
-        trigger: "blur",
-      },
-    ],
-  },
-  {
-    label: "物料规格",
-    prop: "spec",
-    width: 100,
-    overHidden: true,
-    rules: [
-      {
-        required: true,
-        message: "请填写物料规格",
-        trigger: "blur",
-      },
-    ],
-  },
+    rules: [{
+      required: true,
+      message: "请选择物料属性",
+      trigger: "blur"
+    }],
+  },
+  { label: "物料规格", prop: "spec", width: 100,overHidden: true,rules: [{
+      required: true,
+      message: "请填写物料规格",
+      trigger: "blur"
+    }], },
   {
     label: "单位",
     prop: "unitDictValue",
     filterable: true,
     type: "select",
-    dicData: dicts.danwei_type,
+    dicData:dicts.danwei_type,
     props: { label: "dictLabel", value: "dictValue" },
-    rules: [
-      {
-        required: true,
-        message: "请选择单位",
-        trigger: "blur",
-      },
-    ],
+    rules: [{
+      required: true,
+      message: "请选择单位",
+      trigger: "blur"
+    }],
   },
   {
     label: "物料级别",
@@ -83,40 +51,28 @@ export const columns = [
     search: true,
     filterable: true,
     type: "select",
-    width: 100,
-    overHidden: true,
-    dicData: dicts.material_level,
+    width: 100,overHidden: true,
+    dicData:dicts.material_level,
     props: { label: "dictLabel", value: "dictValue" },
-    rules: [
-      {
-        required: true,
-        message: "请选择物料级别",
-        trigger: "blur",
-      },
-    ],
-  },
-  {
-    label: "生产厂家",
-    prop: "manufacturer",
-    width: 100,
-    overHidden: true,
-    rules: [
-      {
-        required: true,
-        message: "请填写生产厂家",
-        trigger: "blur",
-      },
-    ],
-  },
+    rules: [{
+      required: true,
+      message: "请选择物料级别",
+      trigger: "blur"
+    }],
+  },
+  { label: "生产厂家", prop: "manufacturer",width: 100,overHidden: true ,rules: [{
+      required: true,
+      message: "请填写生产厂家",
+      trigger: "blur"
+    }],},
   {
     label: "质检方案",
     prop: "inspectDictValue",
     search: true,
     filterable: true,
     type: "select",
-    width: 100,
-    overHidden: true,
-    dicData: dicts.quality_testing_plan,
+    width: 100,overHidden: true,
+    dicData:dicts.quality_testing_plan,
     props: { label: "dictLabel", value: "dictValue" },
   },
   {
@@ -125,45 +81,37 @@ export const columns = [
     search: true,
     filterable: true,
     type: "select",
-    width: 100,
-    overHidden: true,
-    dicData: dicts.applicable_platforms,
+    width: 100,overHidden: true,
+    dicData:dicts.applicable_platforms,
     props: { label: "dictLabel", value: "dictValue" },
-    rules: [
-      {
-        required: true,
-        message: "请选择适用平台",
-        trigger: "blur",
-      },
-    ],
+    rules: [{
+     required: true, message: "请选择适用平台",
+     trigger: "blur"
+    }],
   },
   {
     label: "质量等级",
     prop: "qualityLevelDictValue",
     search: true,
-    width: 100,
-    overHidden: true,
+    width: 100,overHidden: true,
     filterable: true,
     type: "select",
-    dicData: dicts.quality_grade,
+    dicData:dicts.quality_grade,
     props: { label: "dictLabel", value: "dictValue" },
-    rules: [
-      {
-        required: true,
-        message: "请选择质量等级",
-        trigger: "blur",
-      },
-    ],
+    rules: [{
+      required: true,
+      message: "请选择质量等级",
+      trigger: "blur"
+    }],
   },
   {
     label: "选用类型",
     prop: "selectionDictValue",
     search: true,
     filterable: true,
-    width: 100,
-    overHidden: true,
+    width: 100,overHidden: true,
     type: "select",
-    dicData: dicts.selection_type,
+    dicData:dicts.selection_type,
     props: { label: "dictLabel", value: "dictValue" },
   },
   {
@@ -171,39 +119,29 @@ export const columns = [
     prop: "stageDictValue",
     search: true,
     filterable: true,
-    width: 100,
-    overHidden: true,
+    width: 100,overHidden: true,
     type: "select",
-    dicData: dicts.stage,
+    dicData:dicts.stage,
     props: { label: "dictLabel", value: "dictValue" },
   },
-  { label: "客户型号", prop: "customerModel", width: 100, overHidden: true },
-  {
-    label: "保质期(天)",
-    prop: "qualityGuaranteePeriod",
-    width: 100,
-    overHidden: true,
-    type: "number",
-    min: 0,
-  },
+  { label: "客户型号", prop: "customerModel",width: 100,overHidden: true,  },
+  { label: "保质期(天)", prop: "qualityGuaranteePeriod",width: 100,overHidden: true,type:"number" ,min:0 },
   {
     label: "封装方法",
     prop: "packageDictValue",
     search: true,
-    width: 100,
-    overHidden: true,
+    width: 100,overHidden: true,
     filterable: true,
     type: "select",
-    dicData: dicts.packaging_method,
-    props: { label: "dictLabel", value: "dictLabel" },
+    dicData:dicts.packaging_method,
+    props: { label: "dictLabel", value: "dictValue" },
   },
 
   {
     label: "是否工装",
     prop: "frock",
     search: true,
-    width: 90,
-    overHidden: true,
+    width: 90,overHidden: true,
     filterable: true,
     type: "radio", //类型为单选框
     dicData: [
@@ -215,31 +153,16 @@ export const columns = [
         label: "否",
         value: "0",
       },
+
     ],
-    value: 1,
-    rules: [
-      {
-        required: true,
-        message: "是否工装",
-        trigger: "blur",
-      },
-    ],
-  },
-  {
-    label: "筛选规范",
-    prop: "selectionSpec",
-    width: 150,
-    overHidden: true,
-    type: "textarea",
-    span: 18,
-  },
+    value: "1",
+    rules: [{
+      required: true,
+      message: "是否工装",
+      trigger: "blur"
+    }],
+  },
+  { label: "筛选规范", prop: "selectionSpec",width: 150,overHidden: true,  type: "textarea",span:18},
 
-  {
-    label: "备注",
-    prop: "remark",
-    width: 150,
-    overHidden: true,
-    type: "textarea",
-    span: 18,
-  },
+  { label: "备注", prop: "remark", width: 150,overHidden: true,type: "textarea", span:18 },
 ];

+ 25 - 14
src/views/base/materials/components/drawing-page.vue

@@ -2,7 +2,13 @@
   <div class="mainContentBox">
     <avue-form ref="formRef" v-model="form" :option="option" @submit="rowSave">
       <template #drawingPath="scope">
-        <single-upload v-model="form.drawingPath" />
+        <!--        <single-upload v-model="form.drawingPath" :generatePdf="true"/>-->
+        <FilesUpload
+          v-model:src="fileUrl"
+          v-model:pdf-list="pdfUrlList"
+          :generate-pdf="true"
+          @finished="testFiles"
+        />
       </template>
     </avue-form>
     <avue-crud
@@ -41,7 +47,15 @@
           </el-option>
         </el-select>
       </template>
-
+      <template #menu="{row,index,type}">
+        <PDFView
+          :need-to-show-pdf="true"
+          content-type="button"
+          :is-link="true"
+          :show-pdf-number="1"
+          :pdf-source="filePath + row.pdfPath"
+        />
+      </template>
     </avue-crud>
   </div>
 </template>
@@ -55,11 +69,15 @@ const { isShowTable, tableType } = toRefs(useCommonStoreHook());
 import { useDictionaryStoreHook } from "@/store";
 import { addDrawing,getDrawing } from "@/api/drawing";
 const { dicts } = useDictionaryStoreHook();
+const filePath = import.meta.env.VITE_APP_UPLOAD_URL;
 const test = () => {
   isShowTable.value = true;
   tableType.value = tableType.value == 1 ? 2 : 1;
 };
-
+const testFiles =()=>{
+  form.value.pdfPath = pdfUrlList.value[0]
+  form.value.drawingPath = fileUrl.value
+}
 // 传入一个url,后面不带/
 const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
   useCrud({
@@ -81,7 +99,9 @@ const version=ref({
   label: '请选择图纸版本',
 });
 const options=ref([]);
-
+const fileUrl = ref(""); //单文件
+const pdfUrlList = ref([]);
+import dictDataUtil from "@/common/configs/dictDataUtil";
 const getVersionDrawing=()=>{
   if(version.value.value!="0"){
     search.value.materialCode = props.materialCode;
@@ -184,7 +204,7 @@ option.value = Object.assign(option.value, {
       filterable: true,
       type: 'select',
       width: 100,overHidden: true,
-      dicData:dicts.drawing_type,
+      dicUrl: dictDataUtil.request_url + "drawing_type",
       props: { label: "dictLabel", value: "dictValue" },
       rules: [{
         required: true,
@@ -227,21 +247,12 @@ option.value = Object.assign(option.value, {
         }
 */
     },
-    { label: "图纸",
-      prop: "drawing",
-      type: 'img',
-      span: 24,
-      display:false,
-      slot: true,
-      formatter: (row, column, cellValue, index) => {
-        return import.meta.env.VITE_APP_UPLOAD_URL+`${row.drawingPath}`;} },
 
   ],
   delBtn: false,
   editBtn: false,
   viewBtn: false,
   addBtn: false,
-  menu: false,
 });
 const props = defineProps({
   materialCode: {

+ 13 - 12
src/views/base/materials/index.vue

@@ -41,7 +41,7 @@
           <template #dropdown>
             <el-dropdown-menu>
               <el-dropdown-item
-                @click="downloadTemplate('/api/v1/plan/order/template')"
+                @click="downloadTemplate('/api/v1/base/material/template')"
               >
                 <i-ep-download />下载模板
               </el-dropdown-item>
@@ -53,7 +53,7 @@
         </el-dropdown>
         <el-button
           class="ml-3"
-          @click="exportData('/api/v1/plan/order/export')"
+          @click="exportData('/api/v1/base/material/export')"
         >
           <template #icon> <i-ep-download /> </template>导出
         </el-button>
@@ -82,8 +82,7 @@ import { useCrud } from "@/hooks/userCrud";
 import ButtonPermKeys from "@/common/configs/buttonPermission";
 import { useCommonStoreHook, useDictionaryStoreHook } from "@/store";
 const { isShowTable, tableType } = toRefs(useCommonStoreHook());
-// 数据字典相关
-const { dicts } = useDictionaryStoreHook();
+import { columns } from "./columns";
 
 const test = () => {
   isShowTable.value = true;
@@ -121,14 +120,9 @@ const binding = (row) => {
   router.push(`/base/bom/${row.materialCode}`);
 };
 onMounted(() => {
-  // 设置表格列或者其他自定义的option
-  import("./columns").then((res) => {
-    option.value = Object.assign(option.value, {
-      selection: true,
-      column: res.columns,
-    });
+
     dataList();
-  });
+
 });
 
 /**
@@ -142,7 +136,14 @@ const uploadFinished = () => {
 };
 const importExcelData = () => {
   if (uploadRef.value) {
-    uploadRef.value.show("/api/v1/plan/order/import");
+    uploadRef.value.show("/api/v1/base/material/import");
   }
 };
+
+// 设置表格列或者其他自定义的option
+option.value = Object.assign(option.value, {
+  selection: true,
+  column: columns,
+});
+
 </script>

+ 9 - 2
src/views/base/skill/components/edit-skill.vue

@@ -83,7 +83,6 @@ onMounted(() => {
   getSkillDetail(props.skillId).then(
     (data)=>{
       form.value=data.data;
-      console.info("222",data2.value);
     }
   )
   search.value.employeeSkillId=props.skillId;
@@ -152,6 +151,7 @@ const onHandle=()=>{
   employeeSkill.value.userId=form.value.userId;
   employeeSkill.value.postId=form.value.postId;
   employeeSkill.value.skillList=Array.from(data.value);
+  employeeSkill.value.id=form.value.id;
   addEmployeeSkill(employeeSkill.value).then(
     (data)=>{
       if(data.code==="200") {
@@ -159,7 +159,7 @@ const onHandle=()=>{
           message: data.msg,
           type: "success",
         });
-        props.dialog.visible=false;
+        props.editDialog.visible=false;
       }
       else {
         ElMessage({
@@ -178,6 +178,13 @@ option2.value = {
   clearAbleBtn:false,
   emptyBtn:false,
   column: [
+    { label: "id", prop: "id", width: 130,overHidden: true,search: true ,
+      filterable: true,
+      width: 100,overHidden: true,
+      disabled:false,
+      display:false,
+
+    },
 
     { label: "用户id", prop: "userId", width: 130,overHidden: true,search: true ,
       filterable: true,

+ 5 - 2
src/views/base/skill/index.vue

@@ -55,7 +55,7 @@
       :title="editDialog.title"
       width="800px"
       :destroy-on-close="true"
-      @close="editDialog.visible = false"
+      @close="editClose"
     >
       <editSkill   :editDialog="editDialog" :skillId="editUser.id" :postId="editUser.postId"/>
     </el-dialog>
@@ -85,7 +85,10 @@ const editDialog = reactive({
   title: "编辑",
   visible: false,
 });
-
+const editClose=()=>{
+  editDialog.visible = false;
+  dataList();
+}
 const addRow=()=>{
   dialog.visible=true;
 }

+ 5 - 5
src/views/dashboard/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="dashboard-container">
     <!-- github角标 -->
-    <github-corner class="github-corner" />
+<!--    <github-corner class="github-corner" />-->
 
     <el-card shadow="never">
       <el-row justify="space-between">
@@ -204,16 +204,16 @@ import { useTransition, TransitionPresets } from "@vueuse/core";
 const userStore = useUserStore();
 const date: Date = new Date();
 
-const greetings = computed(() => {
+const greetings = computed?.(() => {
   const hours = date.getHours();
   if (hours >= 6 && hours < 8) {
     return "晨起披衣出草堂,轩窗已自喜微凉🌅!";
   } else if (hours >= 8 && hours < 12) {
-    return "上午好," + userStore.user.nickname + "!";
+    return "上午好," + userStore.user.userName + "!";
   } else if (hours >= 12 && hours < 18) {
-    return "下午好," + userStore.user.nickname + "!";
+    return "下午好," + userStore.user.userName + "!";
   } else if (hours >= 18 && hours < 24) {
-    return "晚上好," + userStore.user.nickname + "!";
+    return "晚上好," + userStore.user.userName + "!";
   } else if (hours >= 0 && hours < 6) {
     return "偷偷向银河要了一把碎星,只等你闭上眼睛撒入你的梦中,晚安🌛!";
   }

+ 3 - 3
src/views/error-page/404.vue

@@ -34,7 +34,7 @@ function message() {
       </div>
       <div class="bullshit">
         <div class="bullshit__oops">OOPS!</div>
-        <div class="bullshit__info">
+<!--        <div class="bullshit__info">
           All rights reserved
           <a
             style="color: #20a0ff"
@@ -42,13 +42,13 @@ function message() {
             target="_blank"
             >wallstreetcn</a
           >
-        </div>
+        </div>-->
         <div class="bullshit__headline">{{ message() }}</div>
         <div class="bullshit__info">
           Please check that the URL you entered is correct, or click the button
           below to return to the homepage.
         </div>
-        <a href="" class="bullshit__return-home">Back to home</a>
+        <a href="" class="bullshit__return-home">跳转首页</a>
       </div>
     </div>
   </div>

+ 4 - 4
src/views/plan/order/index.vue

@@ -49,14 +49,14 @@
             @click="handleEdit(row,0)"
         ><i-ep-edit />编辑
         </el-button>
-        <el-button
+<!--        <el-button
             v-if="row.nameplated === 1"
             type="info"
             link
             size="small"
             @click="handleNameplated(row)"
         ><i-ep-edit />铭牌
-        </el-button>
+        </el-button>-->
         <el-button
             v-hasPerm="[buttonPermission.PLAN.BTNS.order_del]"
             v-if="row.orderState === '0' ||  row.orderState === '1' ||  row.orderState === '2'"
@@ -408,7 +408,7 @@ option.value = {
         },
       ],
     },
-    {
+   /* {
       label: "所属公司",
       prop: "companyId",
       width: 100,
@@ -426,7 +426,7 @@ option.value = {
           trigger: "trigger",
         },
       ],
-    },
+    },*/
     {
       label: "项目号",
       width: 100,

+ 27 - 39
src/views/plan/schedule/index.vue

@@ -1,30 +1,12 @@
 <template>
   <div class="mainContentBox">
-    <avue-crud
-      ref="crudRef"
-      v-model:search="search"
-      v-model="form"
-      :data="data"
-      :option="option"
-      v-model:page="page"
-      @row-save="createRow"
-      @row-update="updateRow"
-      @row-del="deleteRow"
-      @search-change="searchChange"
-      @search-reset="resetChange"
-      @size-change="dataList"
-      @current-change="dataList"
-      @selection-change="selectionChange"
-    >
-
-      <template #menu="{size,row,index}">
-        <el-button
-            icon="el-icon-edit"
-            text
-            v-if="row.state === '-1' || row.state ==='0'"
-            @click="handleEdit(row,index)"
-            type="primary"
-            :size="size">编辑</el-button>
+    <avue-crud ref="crudRef" v-model:search="search" v-model="form" :data="data" :option="option" v-model:page="page"
+      @row-save="createRow" @row-update="updateRow" @row-del="deleteRow" @search-change="searchChange"
+      @search-reset="resetChange" @size-change="dataList" @current-change="dataList"
+      @selection-change="selectionChange">
+      <template #menu="{ size, row, index }">
+        <el-button icon="el-icon-edit" text v-if="row.state === '-1' || row.state === '0'"
+          @click="handleEdit(row, index)" type="primary" :size="size">编辑</el-button>
       </template>
       <template #menu-left>
         <div id="charts"></div>
@@ -36,7 +18,7 @@
 import { ref } from "vue";
 import { useCrud } from "@/hooks/userCrud";
 import dictDataUtil from "@/common/configs/dictDataUtil";
-import {queryStationByLineId} from "@/api/station"
+import { queryStationByLineId } from "@/api/station";
 import { useDictionaryStoreHook } from "@/store";
 import { getStatistics } from "@/api/order/index";
 import * as echarts from "echarts";
@@ -55,14 +37,14 @@ const { selectionChange, multipleDelete } = Methords; //选中和批量删除事
 const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
 
 const crudRef = ref(null); //crudRef.value 获取avue-crud对象
-const stationList = ref([])
-const charts = ref(null);
-const handleEdit =(row,index) =>{
-  queryStationByLineId(row.productLineId).then((data)=>{
-    stationList.value = data.data
-  })
+const stationList = ref([]);
+const charts = shallowRef(null);
+const handleEdit = (row, index) => {
+  queryStationByLineId(row.productLineId).then((data) => {
+    stationList.value = data.data;
+  });
   crudRef.value && crudRef.value.rowEdit(row, index);
-}
+};
 onMounted(() => {
   charts.value = echarts.init(document.getElementById("charts"));
 
@@ -76,6 +58,9 @@ onMounted(() => {
         text: "任务状态统计图",
         left: "center",
       },
+      tooltip: {
+        trigger: "item",
+      },
       xAxis: {
         data: key,
       },
@@ -128,15 +113,17 @@ option.value = Object.assign(option.value, {
       label: "工位名称",
       hide: true,
       editDisabled: false,
-      type: 'select',
+      type: "select",
       dicData: stationList,
       prop: "stationId",
       props: { label: "name", value: "id" },
-      rules: [{
-        required: true,
-        message: "请选择工位名称",
-        trigger: "blur"
-      }],
+      rules: [
+        {
+          required: true,
+          message: "请选择工位名称",
+          trigger: "blur",
+        },
+      ],
     },
     {
       label: "工单编码",
@@ -216,6 +203,7 @@ option.value = Object.assign(option.value, {
 :deep(.avue-crud__left) {
   width: 100%;
 }
+
 #charts {
   width: 100%;
   height: 300px;

+ 3 - 3
src/views/pro/traceability/components/faultCom.vue

@@ -80,7 +80,7 @@ option.value = Object.assign(option.value, {
     },
     {
       label: "报故人",
-      prop: "personResponsible",
+      prop: "creator",
       search: false,
     },
     {
@@ -95,8 +95,8 @@ option.value = Object.assign(option.value, {
     },
     {
       label: "处理结果",
-      prop: "disposalMeasures",
-      dicData: dicts.disposal_measures_type,
+      prop: "currentState",
+      dicData: dicts.fault_current_state,
       props: {
         label: "dictLabel",
         value: "dictValue",

+ 0 - 2
src/views/pro/traceability/index.vue

@@ -153,9 +153,7 @@
 <script setup>
 import { ref, getCurrentInstance } from "vue";
 import { useCrud } from "@/hooks/userCrud";
-import ButtonPermKeys from "@/common/configs/buttonPermission";
 import { traceabilityTabCount } from "@/api/process";
-import { useCommonStoreHook } from "@/store";
 import { getMaterialDetailsByseqNo, getOperationCompent } from "@/api/material";
 import TraceabilityCom from "@/views/pro/traceability/components/traceabilityCom.vue";
 import MaterialsCom from "@/views/pro/traceability/components/materialsCom.vue";

+ 397 - 3
src/views/report/statistics/dailystorage/index.vue

@@ -1,7 +1,401 @@
 <template>
-  <div>src/views/report/statistics/dailystorage /index</div>
+  <div class="mainContentBox">
+    <avue-crud ref="crudRef1" v-model:search="data1.search" :data="data1.data" :option="data1.option"
+      v-model:page="data1.page" @row-save="createRow" @row-update="updateRow" @row-del="deleteRow"
+      @search-change="searchChange" @search-reset="resetChange" @size-change="dataList" @current-change="dataList"
+      @selection-change="selectionChange" @cell-click="ckickCell">
+      <template #header="{ size }">
+        <div id="dailystoragecharts"></div>
+      </template>
+    </avue-crud>
+    <el-dialog v-model="editDialog.visible" :title="editDialog.title" width="1200px"
+      @close="editDialog.visible = false">
+      <div class="mainContentBox">
+        <avue-crud ref="crudRef2" v-model:search="data2.search" :data="data2.data" :option="data2.option"
+          v-model:page="data2.page" @row-update="data2.Methords.updateRow" @row-del="data2.Methords.deleteRow"
+          @search-change="data2.Methords.dataList" @search-reset="data2.Methords.resetChange"
+          @size-change="data2.Methords.dataList" @current-change="data2.Methords.dataList"
+          @selection-change="data2.Methords.selectionChange" />
+      </div>
+    </el-dialog>
+  </div>
 </template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+import { useCommonStoreHook, useDictionaryStoreHook } from "@/store";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+import editSkill from "@/views/base/skill/components/edit-skill.vue";
+import { getEchartData } from "@/api/report";
+import * as echarts from "echarts";
+// 数据字典相关
+const { dicts } = useDictionaryStoreHook();
+const editDialog = ref({ visible: false, title: "订单详情" });
+// const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+//   useCrud({
+//     src: "/api/v1/process/census/completeOrder",
+//   });
+// ;
+const data1 = ref(
+  useCrud({
+    src: "/api/v1/process/census/completeOrder",
+  })
+);
+const data2 = ref(
+  useCrud({
+    src: "/api/v1/process/census/completeSeq",
+  })
+);
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+  data1.value.Methords;
 
-<script setup lang="ts"></script>
+const { selectionChange, multipleDelete } = data1.value.Methords;
+const charts = shallowRef(null);
+const chartKey = ref(false);
+const chartsData = shallowRef([]);
+const cellStyle = ({ row, column, rowIndex, columnIndex }) => {
+  if (columnIndex == 2) {
+    // return "color:'#409eff';cursor:'pointer'";
+    return "cellStyle";
+  }
+};
+const ckickCell = (row, column, cell, event) => {
+  if (column.label === "订单名称") {
+    data2.value.search.completeTime = row.completeTime;
+    data2.value.search.orderCode = row.orderCode;
+    editDialog.value.visible = true;
+  }
+};
+// 设置表格列或者其他自定义的option
+data1.value.option = Object.assign(data1.value.option, {
+  selection: false,
+  menu: false,
+  menuWidth: 100,
+  addBtn: false,
+  filterBtn: false,
+  searchShowBtn: false,
+  columnBtn: false,
+  gridBtn: false,
+  editBtn: false,
+  viewBtn: false,
+  delBtn: false,
+  column: [
+    {
+      label: "日期范围",
+      prop: "searchTime",
+      search: true,
+      hide: true,
+      type: "date",
+      format: "YYYY-MM-DD",
+      valueFormat: "YYYY-MM-DD",
+      searchRange: true,
+      startPlaceholder: "开始日期",
+      endPlaceholder: "结束日期",
+    },
+    {
+      label: "erp订单号",
+      prop: "erpCode",
+      overHidden: true,
+      search: true,
+      editDisabled: true,
+      hide: true,
+    },
+    {
+      label: "产品规格",
+      prop: "userName",
+      overHidden: true,
+      search: true,
+      editDisabled: true,
+      hide: true,
+    },
+    {
+      label: "订单编码",
+      prop: "orderCode",
+      overHidden: true,
+      search: true,
+      editDisabled: true,
+      hide: true,
+    },
+    {
+      label: "订单名称",
+      prop: "orderName",
+      width: 140,
+      overHidden: true,
+      search: true,
+      editDisabled: true,
+      hide: true,
+    },
+    {
+      label: "项目编码",
+      prop: "projectCode",
+      width: 140,
+      overHidden: true,
+      search: true,
+      editDisabled: true,
+      hide: true,
+    },
+    {
+      label: "订单名称",
+      prop: "orderName",
+      search: false,
+      slot: true,
+      html: true,
+      formatter: (val) => {
+        return (
+          '<span style="color:#409eff;cursor:pointer">' +
+          val.orderName +
+          "</span>"
+        );
+      },
+    },
+    {
+      label: "erp订单号",
+      prop: "erpCode",
+      search: false,
+    },
+    {
+      label: "交付日期",
+      prop: "deliverTime",
+      search: false,
+    },
+    {
+      label: "完工日期",
+      prop: "completeTime",
+      search: false,
+    },
+    {
+      label: "项目编码",
+      prop: "projectCode",
+      search: false,
+    },
+    {
+      label: "产品编码",
+      prop: "materialCode",
+      search: false,
+    },
+    {
+      label: "产品名称",
+      prop: "materialName",
+      search: false,
+    },
+    {
+      label: "产品规格",
+      prop: "materialModel",
+      search: false,
+    },
+    {
+      label: "计划总共用时",
+      prop: "planTotalTime",
+      search: false,
+    },
+    {
+      label: "实际总共用时",
+      prop: "realTotalTime",
+      search: false,
+    },
+    {
+      label: "总入库数量",
+      prop: "total",
+      search: false,
+    },
+  ],
+});
+data2.value.option = Object.assign(data2.value.option, {
+  selection: false,
+  addBtn: false,
+  filterBtn: false,
+  searchShowBtn: false,
+  menu: false,
+  addBtn: false,
+  filterBtn: false,
+  searchShowBtn: false,
+  columnBtn: false,
+  gridBtn: false,
+  editBtn: false,
+  viewBtn: false,
+  delBtn: false,
+  column: [
+    {
+      label: "交付日期",
+      prop: "deliverTime",
+      search: false,
+    },
+    {
+      label: "完工日期",
+      prop: "completeTime",
+      search: false,
+    },
+    {
+      label: "项目编码",
+      prop: "projectCode",
+      search: false,
+    },
+    {
+      label: "产品编码",
+      prop: "materialCode",
+      search: false,
+    },
+    {
+      label: "产品名称",
+      prop: "materialName",
+      search: false,
+    },
+    {
+      label: "产品规格",
+      prop: "materialModel",
+      search: false,
+    },
+    {
+      label: "计划总共用时",
+      prop: "planTotalTime",
+      search: false,
+    },
+    {
+      label: "实际总共用时",
+      prop: "realTotalTime",
+      search: false,
+    },
+    {
+      label: "总入库数量",
+      prop: "total",
+      search: false,
+    },
+  ],
+});
 
-<style scoped lang="scss"></style>
+const getCurrentMonthStartAndEndDates = () => {
+  // 获取当前日期
+  let now = new Date();
+
+  // 获取当前月份的第一天
+  let startDate = new Date(now.getFullYear(), now.getMonth(), 1);
+
+  // 获取当前月份的最后一天
+  let endDate = new Date(now.getFullYear(), now.getMonth() + 1, 0);
+
+  // 格式化日期为'YYYY-MM-DD'格式
+  function formatDate(date) {
+    let year = date.getFullYear();
+    let month = String(date.getMonth() + 1).padStart(2, "0");
+    let day = String(date.getDate()).padStart(2, "0");
+    return `${year}-${month}-${day}`;
+  }
+
+  // 返回包含开始和结束日期的数组
+  return [formatDate(startDate), formatDate(endDate)];
+};
+const chartSeriesData = shallowRef([]);
+const setChartSeries = () => {
+  let array = [];
+  for (let j = 0; j < chartsData.value.orderData.length; j++) {
+    array.push({
+      name: chartsData.value.orderData[j].orderName,
+      type: "bar",
+      barGap: 0,
+      label: labelOption,
+      emphasis: {
+        focus: "series",
+      },
+      data: chartsData.value.orderData[j].total,
+    });
+  }
+  chartSeriesData.value = array;
+};
+const echartOption = ref({
+  tooltip: {
+    trigger: "axis",
+    axisPointer: {
+      type: "shadow",
+    },
+  },
+  legend: {
+    // data: chartsData.value.orderCodes,
+    data: [],
+  },
+  xAxis: [
+    {
+      type: "category",
+      axisTick: { show: false },
+      // data: chartsData.value.dateList,
+      data: [],
+    },
+  ],
+  yAxis: [
+    {
+      type: "value",
+    },
+  ],
+  toolbox: {
+    feature: {
+      saveAsImage: {},
+    },
+  },
+  series: [],
+  // series: chartSeriesData.value,
+});
+const clickSearch = async () => {
+  await setChartsData();
+  await setChartSeries();
+  echartOption.value.legend.data = chartsData.value.orderCodes;
+  echartOption.value.xAxis[0].data = chartsData.value.dateList;
+  echartOption.value.series = chartSeriesData.value;
+  charts.value.setOption(echartOption.value, true);
+};
+//设置搜索条件中的时间范围为默认此月
+const setTime = () => {
+  data1.value.search.searchTime = getCurrentMonthStartAndEndDates();
+};
+const labelOption = {
+  show: false,
+  position: "insideBottom",
+  distance: 15,
+  align: "left",
+  verticalAlign: "middle",
+  rotate: 90,
+  formatter: "{c}  {name|{a}}",
+  fontSize: 24,
+  rich: {
+    name: {},
+  },
+};
+const setChartsData = async () => {
+  const { data } = await getEchartData(data1.value.search);
+  chartsData.value = data;
+};
+
+onMounted(async () => {
+  setTime();
+  charts.value = echarts.init(document.getElementById("dailystoragecharts"));
+  dataList();
+});
+watch(
+  () => editDialog.value.visible,
+  () => {
+    if (editDialog.value.visible == true) {
+      data2.value.Methords.dataList();
+    }
+  }
+);
+watch(
+  () => data1.value.data,
+  () => {
+    clickSearch();
+  }
+);
+</script>
+<style lang="scss" scoped>
+:deep(.avue-crud__left) {
+  width: 100%;
+}
+
+.cellStyle {
+  color: "#409eff" !important;
+  cursor: "pointer" !important;
+}
+
+#dailystoragecharts {
+  width: 100%;
+  height: 400px;
+  border: 1px solid #ccc;
+}
+</style>

+ 227 - 0
src/views/report/statistics/outputstatistics/index.vue

@@ -0,0 +1,227 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud ref="crudRef1" v-model:search="data1.search" :data="data1.data" :option="data1.option"
+      v-model:page="data1.page" @row-save="createRow" @row-update="updateRow" @row-del="deleteRow"
+      @search-change="searchChange" @search-reset="resetChange" @size-change="dataList" @current-change="dataList"
+      @selection-change="selectionChange" />
+  </div>
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+import { useCommonStoreHook, useDictionaryStoreHook } from "@/store";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+import editSkill from "@/views/base/skill/components/edit-skill.vue";
+import { getEchartData } from "@/api/report";
+import * as echarts from "echarts";
+// 数据字典相关
+const { dicts } = useDictionaryStoreHook();
+const editDialog = ref({ visible: false, title: "订单详情" });
+const key = ref(false);
+// const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+//   useCrud({
+//     src: "/api/v1/process/census/completeOrder",
+//   });
+// ;
+const data1 = ref(
+  useCrud({
+    src: "/api/v1/process/census/outputInfo",
+  })
+);
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+  data1.value.Methords;
+
+const { selectionChange, multipleDelete } = data1.value.Methords;
+
+// 设置表格列或者其他自定义的option
+data1.value.option = Object.assign(data1.value.option, {
+  selection: false,
+  menuWidth: 100,
+  addBtn: false,
+  filterBtn: false,
+  searchShowBtn: false,
+  columnBtn: false,
+  gridBtn: false,
+  editBtn: false,
+  viewBtn: false,
+  delBtn: false,
+  column: [
+    {
+      label: "日期范围",
+      prop: "searchTime",
+      search: true,
+      hide: true,
+      type: "date",
+      format: "YYYY-MM-DD",
+      valueFormat: "YYYY-MM-DD",
+      searchRange: true,
+      startPlaceholder: "开始日期",
+      endPlaceholder: "结束日期",
+    },
+    {
+      label: "订单编码",
+      prop: "orderCode",
+      overHidden: true,
+      search: true,
+      editDisabled: true,
+      hide: true,
+    },
+    {
+      label: "订单名称",
+      prop: "orderName",
+      overHidden: true,
+      search: true,
+      editDisabled: true,
+      hide: true,
+    },
+    {
+      label: "物料编码",
+      prop: "materialCode",
+      overHidden: true,
+      search: true,
+      editDisabled: true,
+      hide: true,
+    },
+    {
+      label: "工单编码",
+      prop: "workOrderCode",
+      width: 140,
+      overHidden: true,
+      search: true,
+      editDisabled: true,
+      hide: true,
+    },
+    {
+      label: "报工人员",
+      prop: "userName",
+      width: 140,
+      overHidden: true,
+      search: true,
+      editDisabled: true,
+      hide: true,
+    },
+    {
+      label: "工序code",
+      prop: "operationCode",
+      width: 140,
+      overHidden: true,
+      search: true,
+      editDisabled: true,
+      hide: true,
+    },
+    {
+      label: "订单名称",
+      prop: "orderName",
+      search: false,
+    },
+    {
+      label: "订单编码",
+      prop: "orderCode",
+      search: false,
+    },
+    {
+      label: "工单编码",
+      prop: "workOrderCode",
+      search: false,
+    },
+    {
+      label: "物料编码",
+      prop: "materialCode",
+      search: false,
+    },
+    {
+      label: "物料名称",
+      prop: "materialName",
+      search: false,
+    },
+    {
+      label: "物料规格",
+      prop: "materialModel",
+      search: false,
+    },
+    {
+      label: "工序编码",
+      prop: "operationCode",
+      search: false,
+    },
+    {
+      label: "工序名称",
+      prop: "operationName",
+      search: false,
+    },
+    {
+      label: "工位",
+      prop: "stationName",
+      search: false,
+    },
+    {
+      label: "流转卡号",
+      prop: "seqNo",
+      search: false,
+    },
+
+    {
+      label: "开始时间",
+      prop: "realStartWhen",
+      search: false,
+    },
+    {
+      label: "结束时间",
+      prop: "realEndWhen",
+      search: false,
+    },
+    {
+      label: "标准用时",
+      prop: "standardWorktime",
+      search: false,
+    },
+    {
+      label: "总共用时",
+      prop: "totalTime",
+      search: false,
+    },
+    {
+      label: "人员占比",
+      prop: "userTime",
+      search: false,
+    },
+  ],
+});
+
+const getCurrentMonthStartAndEndDates = () => {
+  // 获取当前日期
+  let now = new Date();
+
+  // 获取当前月份的第一天
+  let startDate = new Date(now.getFullYear(), now.getMonth(), 1);
+
+  // 获取当前月份的最后一天
+  let endDate = new Date(now.getFullYear(), now.getMonth() + 1, 0);
+
+  // 格式化日期为'YYYY-MM-DD'格式
+  function formatDate(date) {
+    let year = date.getFullYear();
+    let month = String(date.getMonth() + 1).padStart(2, "0");
+    let day = String(date.getDate()).padStart(2, "0");
+    return `${year}-${month}-${day}`;
+  }
+
+  // 返回包含开始和结束日期的数组
+  return [formatDate(startDate), formatDate(endDate)];
+};
+
+//设置搜索条件中的时间范围为默认此月
+const setTime = () => {
+  data1.value.search.searchTime = getCurrentMonthStartAndEndDates();
+};
+
+onMounted(async () => {
+  setTime();
+  dataList();
+});
+</script>
+<style lang="scss" scoped>
+:deep(.avue-crud__left) {
+  width: 100%;
+}
+</style>

+ 323 - 0
src/views/report/statistics/processanomaly/index.vue

@@ -0,0 +1,323 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud ref="crudRef1" v-model:search="data1.search" :data="data1.data" :option="data1.option"
+      v-model:page="data1.page" @row-save="createRow" @row-update="updateRow" @row-del="deleteRow"
+      @search-change="searchChange" @search-reset="resetChange" @size-change="dataList" @current-change="dataList"
+      @selection-change="selectionChange" @cell-click="ckickCell">
+      <template #menu="{ row, index, type }">
+        <el-button @click="ckickCell(row)" icon="el-icon-view" text type="primary">查看</el-button>
+      </template>
+      <template #menu-right="{}">
+        <el-button class="ml-3" @click="
+          data1.Utils.exportData(
+            '/api/v1/process/census/abnormalOperation/export'
+          )
+          ">
+          <template #icon> <i-ep-download /> </template>导出
+        </el-button>
+      </template>
+    </avue-crud>
+    <el-dialog v-model="editDialog.visible" :title="editDialog.title" width="1200px"
+      @close="editDialog.visible = false">
+      <div class="mainContentBox">
+        <avue-crud ref="crudRef2" v-model:search="data2.search" :data="data2.data" :option="data2.option"
+          v-model:page="data2.page" @row-update="data2.Methords.updateRow" @row-del="data2.Methords.deleteRow"
+          @search-change="data2.Methords.dataList" @search-reset="data2.Methords.resetChange"
+          @size-change="data2.Methords.dataList" @current-change="data2.Methords.dataList"
+          @selection-change="data2.Methords.selectionChange">
+          <template #menu-right="{}">
+            <el-button class="ml-3" @click="
+              data2.Utils.exportData(
+                '/api/v1/process/census/abnormalOperationDetails/export'
+              )
+              ">
+              <template #icon> <i-ep-download /> </template>导出
+            </el-button>
+          </template></avue-crud>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+import { useCommonStoreHook, useDictionaryStoreHook } from "@/store";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+import editSkill from "@/views/base/skill/components/edit-skill.vue";
+import { getEchartData } from "@/api/report";
+import * as echarts from "echarts";
+// 数据字典相关
+const { dicts } = useDictionaryStoreHook();
+const editDialog = ref({ visible: false, title: "订单详情" });
+const key = ref(false);
+// const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+//   useCrud({
+//     src: "/api/v1/process/census/completeOrder",
+//   });
+// ;
+const data1 = ref(
+  useCrud({
+    src: "/api/v1/process/census/abnormalOperation",
+  })
+);
+const data2 = ref(
+  useCrud({
+    src: "/api/v1/process/census/abnormalOperationDetails",
+  })
+);
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+  data1.value.Methords;
+
+const { selectionChange, multipleDelete } = data1.value.Methords;
+
+const ckickCell = (row) => {
+  data2.value.search.workOrderCode = row.workOrderCode;
+  data2.value.search.searchTime = data1.value.search.searchTime;
+  editDialog.value.visible = true;
+};
+// 设置表格列或者其他自定义的option
+data1.value.option = Object.assign(data1.value.option, {
+  selection: false,
+  menu: true,
+  menuWidth: 100,
+  addBtn: false,
+  filterBtn: false,
+  searchShowBtn: false,
+  columnBtn: false,
+  gridBtn: false,
+  editBtn: false,
+  viewBtn: false,
+  delBtn: false,
+  column: [
+    {
+      label: "日期范围",
+      prop: "searchTime",
+      search: true,
+      hide: true,
+      type: "date",
+      format: "YYYY-MM-DD",
+      valueFormat: "YYYY-MM-DD",
+      searchRange: true,
+      startPlaceholder: "开始日期",
+      endPlaceholder: "结束日期",
+    },
+    {
+      label: "订单编码",
+      prop: "orderCode",
+      overHidden: true,
+      search: true,
+      editDisabled: true,
+      hide: true,
+    },
+    {
+      label: "订单名称",
+      prop: "orderName",
+      overHidden: true,
+      search: true,
+      editDisabled: true,
+      hide: true,
+    },
+    {
+      label: "物料编码",
+      prop: "materialCode",
+      overHidden: true,
+      search: true,
+      editDisabled: true,
+      hide: true,
+    },
+    {
+      label: "工单编码",
+      prop: "workOrderCode	",
+      width: 140,
+      overHidden: true,
+      search: true,
+      editDisabled: true,
+      hide: true,
+    },
+    {
+      label: "订单名称",
+      prop: "orderName",
+      search: false,
+    },
+    {
+      label: "订单编码",
+      prop: "orderCode",
+      search: false,
+    },
+    {
+      label: "工单编码",
+      prop: "workOrderCode",
+      search: false,
+    },
+    {
+      label: "工单数量",
+      prop: "planNum",
+      search: false,
+    },
+    {
+      label: "物料编码",
+      prop: "materialCode",
+      search: false,
+    },
+    {
+      label: "物料名称",
+      prop: "materialName",
+      search: false,
+    },
+    {
+      label: "物料规格",
+      prop: "materialModel",
+      search: false,
+    },
+    {
+      label: "工序编码",
+      prop: "operationCode",
+      search: false,
+    },
+    {
+      label: "工序名称",
+      prop: "operationName",
+      search: false,
+    },
+    {
+      label: "异常数量",
+      prop: "count",
+      search: false,
+    },
+  ],
+});
+data2.value.option = Object.assign(data2.value.option, {
+  selection: false,
+  addBtn: false,
+  filterBtn: false,
+  searchShowBtn: false,
+  menu: false,
+  addBtn: false,
+  filterBtn: false,
+  searchShowBtn: false,
+  columnBtn: false,
+  gridBtn: false,
+  editBtn: false,
+  viewBtn: false,
+  delBtn: false,
+  column: [
+    {
+      label: "订单名称",
+      prop: "orderName",
+      search: false,
+    },
+    {
+      label: "订单编码",
+      prop: "orderCode",
+      search: false,
+    },
+    {
+      label: "工单编码",
+      prop: "workOrderCode",
+      search: false,
+    },
+    {
+      label: "物料编码",
+      prop: "materialCode",
+      search: false,
+    },
+    {
+      label: "物料名称",
+      prop: "materialName",
+      search: false,
+    },
+    {
+      label: "物料规格",
+      prop: "materialModel",
+      search: false,
+    },
+    {
+      label: "工序编码",
+      prop: "operationCode",
+      search: false,
+    },
+    {
+      label: "工序名称",
+      prop: "operationName",
+      search: false,
+    },
+    {
+      label: "工位",
+      prop: "stationName",
+      search: false,
+    },
+    {
+      label: "流转卡号",
+      prop: "seqNo",
+      search: false,
+    },
+    {
+      label: "开始时间",
+      prop: "realStartWhen",
+      search: false,
+    },
+    {
+      label: "结束时间",
+      prop: "realEndWhen",
+      search: false,
+    },
+    {
+      label: "标准用时",
+      prop: "standardWorktime",
+      search: false,
+    },
+    {
+      label: "总共用时",
+      prop: "totalTime",
+      search: false,
+    },
+  ],
+});
+
+const getCurrentMonthStartAndEndDates = () => {
+  // 获取当前日期
+  let now = new Date();
+
+  // 获取当前月份的第一天
+  let startDate = new Date(now.getFullYear(), now.getMonth(), 1);
+
+  // 获取当前月份的最后一天
+  let endDate = new Date(now.getFullYear(), now.getMonth() + 1, 0);
+
+  // 格式化日期为'YYYY-MM-DD'格式
+  function formatDate(date) {
+    let year = date.getFullYear();
+    let month = String(date.getMonth() + 1).padStart(2, "0");
+    let day = String(date.getDate()).padStart(2, "0");
+    return `${year}-${month}-${day}`;
+  }
+
+  // 返回包含开始和结束日期的数组
+  return [formatDate(startDate), formatDate(endDate)];
+};
+
+//设置搜索条件中的时间范围为默认此月
+const setTime = () => {
+  data1.value.search.searchTime = getCurrentMonthStartAndEndDates();
+};
+
+onMounted(async () => {
+  setTime();
+  dataList();
+});
+watch(
+  () => editDialog.value.visible,
+  () => {
+    if (editDialog.value.visible == true) {
+      data2.value.Methords.dataList();
+    } else {
+      key.value = !key.value;
+    }
+  }
+);
+</script>
+<style lang="scss" scoped>
+:deep(.avue-crud__left) {
+  width: 100%;
+}
+</style>

+ 307 - 3
src/views/report/statistics/stationBeat/index.vue

@@ -1,7 +1,311 @@
 <template>
-  <div>src/views/report/statistics/stationBeat /index</div>
+  <div class="mainContentBox">
+    <avue-crud ref="crudRef1" v-model:search="data1.search" :data="data1.data" :option="data1.option"
+      v-model:page="data1.page" @row-update="updateRow" @row-del="deleteRow" @search-change="dataList"
+      @search-reset="resetChange" @size-change="dataList" @current-change="dataList"
+      @selection-change="selectionChange">
+      <template #header="{ size }">
+        <div id="dailystoragecharts"></div>
+      </template>
+      <template #menu-right="{}">
+        <el-button class="ml-3" @click="exportData('/api/v1/process/census/beatInfo/export')">
+          <template #icon> <i-ep-download /> </template>导出
+        </el-button>
+      </template>
+    </avue-crud>
+  </div>
 </template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+import { useCommonStoreHook, useDictionaryStoreHook } from "@/store";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+import editSkill from "@/views/base/skill/components/edit-skill.vue";
+import { getBeatInfo } from "@/api/report";
+import * as echarts from "echarts";
+// 数据字典相关
+const { dicts } = useDictionaryStoreHook();
+// const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+//   useCrud({
+//     src: "/api/v1/process/census/completeOrder",
+//   });
+// ;
+const data1 = ref(
+  useCrud({
+    src: "/api/v1/process/census/beatInfo",
+  })
+);
 
-<script setup lang="ts"></script>
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+  data1.value.Methords;
 
-<style scoped lang="scss"></style>
+const { selectionChange, multipleDelete } = data1.value.Methords;
+const { checkBtnPerm, downloadTemplate, exportData } = data1.value.Utils;
+const charts = shallowRef(null);
+const chartsData = ref([]);
+
+// 设置表格列或者其他自定义的option
+data1.value.option = Object.assign(data1.value.option, {
+  selection: true,
+  menu: false,
+  menuWidth: 100,
+  addBtn: false,
+  filterBtn: false,
+  searchShowBtn: false,
+  columnBtn: false,
+  gridBtn: false,
+  editBtn: false,
+  viewBtn: false,
+  delBtn: false,
+  column: [
+    {
+      label: "日期范围",
+      prop: "searchTime",
+      search: true,
+      hide: true,
+      type: "date",
+      format: "YYYY-MM-DD",
+      valueFormat: "YYYY-MM-DD",
+      searchRange: true,
+      startPlaceholder: "开始日期",
+      endPlaceholder: "结束日期",
+    },
+    {
+      label: "订单编码",
+      prop: "orderCode",
+      overHidden: true,
+      search: true,
+      editDisabled: true,
+      hide: true,
+    },
+    {
+      label: "物料编码",
+      prop: "materialCode",
+      overHidden: true,
+      search: true,
+      editDisabled: true,
+      hide: true,
+    },
+    {
+      label: "工单编码",
+      prop: "workOrderCode",
+      width: 140,
+      overHidden: true,
+      search: true,
+      editDisabled: true,
+      hide: true,
+    },
+    //展示
+    {
+      label: "订单编码",
+      prop: "orderCode",
+      search: false,
+    },
+    {
+      label: "订单名称",
+      prop: "orderName",
+      search: false,
+    },
+    {
+      label: "工单编码",
+      prop: "workOrderCode",
+      search: false,
+    },
+    {
+      label: "工单数量",
+      prop: "planNum",
+      search: false,
+    },
+    {
+      label: "物料编码",
+      prop: "materialCode",
+      search: false,
+    },
+    {
+      label: "物料名称",
+      prop: "materialName",
+      search: false,
+    },
+    {
+      label: "物料规格",
+      prop: "materialModel",
+      search: false,
+    },
+    {
+      label: "标准用时",
+      prop: "standardWorktime",
+      search: false,
+    },
+    {
+      label: "总共用时",
+      prop: "totalTime",
+      search: false,
+    },
+    {
+      label: "时差比",
+      prop: "totalTime",
+      search: false,
+      html: true,
+      formatter: (val) => {
+        return (
+          "<span>" +
+          (Number(val.totalTime) - Number(val.standardWorktime)) +
+          "</span>"
+        );
+      },
+    },
+  ],
+});
+
+const getCurrentMonthStartAndEndDates = () => {
+  // 获取当前日期
+  let now = new Date();
+
+  // 获取当前月份的第一天
+  let startDate = new Date(now.getFullYear(), now.getMonth(), 1);
+
+  // 获取当前月份的最后一天
+  let endDate = new Date(now.getFullYear(), now.getMonth() + 1, 0);
+
+  // 格式化日期为'YYYY-MM-DD'格式
+  function formatDate(date) {
+    let year = date.getFullYear();
+    let month = String(date.getMonth() + 1).padStart(2, "0");
+    let day = String(date.getDate()).padStart(2, "0");
+    return `${year}-${month}-${day}`;
+  }
+
+  // 返回包含开始和结束日期的数组
+  return [formatDate(startDate), formatDate(endDate)];
+};
+const clickSearch = async () => {
+  await setChartsData();
+  setOption();
+  charts.value.setOption(
+    {
+      tooltip: {
+        trigger: "axis",
+        axisPointer: {
+          type: "shadow",
+        },
+      },
+      legend: {
+        data: ["标准用时", "总共用时", "时差比"],
+      },
+      xAxis: [
+        {
+          type: "category",
+          axisTick: { show: false },
+          data: chartOption.value.xData,
+        },
+      ],
+      toolbox: {
+        feature: {
+          saveAsImage: {},
+        },
+      },
+      yAxis: [
+        {
+          type: "value",
+        },
+      ],
+      series: chartOption.value.series,
+    },
+    true
+  );
+};
+//设置搜索条件中的时间范围为默认此月
+const setTime = () => {
+  data1.value.search.searchTime = getCurrentMonthStartAndEndDates();
+};
+const labelOption = {
+  show: false,
+  position: "insideBottom",
+  distance: 15,
+  align: "left",
+  verticalAlign: "middle",
+  rotate: 90,
+  formatter: "{c}  {name|{a}}",
+  fontSize: 24,
+  rich: {
+    name: {},
+  },
+};
+const chartOption = ref({
+  xData: [],
+  series: [],
+});
+const setChartsData = async () => {
+  const { data } = await getBeatInfo({
+    ...data1.value.search,
+    pageSize: 99999,
+  });
+  chartsData.value = data.records;
+};
+const setOption = () => {
+  let array1 = [];
+  let array2 = [];
+  let obj1 = {
+    name: "标准用时",
+    type: "bar",
+    barGap: 0,
+    label: labelOption,
+    emphasis: {
+      focus: "series",
+    },
+    data: [],
+  };
+  let obj2 = {
+    name: "总共用时",
+    type: "bar",
+    barGap: 0,
+    label: labelOption,
+    emphasis: {
+      focus: "series",
+    },
+    data: [],
+  };
+  let obj3 = {
+    name: "时差比",
+    type: "bar",
+    barGap: 0,
+    label: labelOption,
+    emphasis: {
+      focus: "series",
+    },
+    data: [],
+  };
+  chartsData.value.forEach((item) => {
+    array1.push(`${item.orderName}:${item.workOrderCode}`);
+    obj1.data.push(item.standardWorktime);
+    obj2.data.push(item.totalTime);
+    obj3.data.push(Number(item.totalTime) - Number(item.standardWorktime));
+  });
+  array2 = [obj1, obj2, obj3];
+  chartOption.value.xData = array1;
+  chartOption.value.series = array2;
+};
+
+onMounted(async () => {
+  setTime();
+  charts.value = echarts.init(document.getElementById("dailystoragecharts"));
+  dataList();
+  clickSearch();
+});
+</script>
+<style lang="scss" scoped>
+:deep(.avue-crud__left) {
+  width: 100%;
+}
+
+.cellStyle {
+  color: "#409eff" !important;
+  cursor: "pointer" !important;
+}
+
+#dailystoragecharts {
+  width: 100%;
+  height: 400px;
+  border: 1px solid #ccc;
+}
+</style>

+ 362 - 0
src/views/report/statistics/workeveryday/index.vue

@@ -0,0 +1,362 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud ref="crudRef1" v-model:search="data1.search" :data="data1.data" :option="data1.option"
+      v-model:page="data1.page" @row-save="createRow" @row-update="updateRow" @row-del="deleteRow"
+      @search-change="searchChange" @search-reset="resetChange" @size-change="dataList" @current-change="dataList"
+      @selection-change="selectionChange">
+      <template #menu="{ row, index, type }">
+        <el-button @click="ckickCell(row)" icon="el-icon-view" text type="primary">查看</el-button>
+      </template>
+      <template #header="">
+        <div id="dailystoragecharts"></div>
+      </template>
+      <template #menu-right="{}">
+        <el-button class="ml-3" @click="
+          data1.Utils.exportData(
+            '/api/v1/process/census/abnormalOperation/export'
+          )
+          ">
+          <template #icon> <i-ep-download /> </template>导出
+        </el-button>
+      </template>
+    </avue-crud>
+    <el-dialog v-model="editDialog.visible" :title="editDialog.title" width="1200px"
+      @close="editDialog.visible = false">
+      <div class="mainContentBox">
+        <div id="dailystoragecharts2"></div>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+import { useCommonStoreHook, useDictionaryStoreHook } from "@/store";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+import editSkill from "@/views/base/skill/components/edit-skill.vue";
+import { getOperationList, getOperationInfo } from "@/api/report";
+import * as echarts from "echarts";
+// 数据字典相关
+const { dicts } = useDictionaryStoreHook();
+const editDialog = ref({ visible: false, title: "订单详情" });
+const charts = shallowRef(null);
+const charts2 = shallowRef(null);
+const chartsSearch = ref({});
+const key = ref(false);
+// const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+//   useCrud({
+//     src: "/api/v1/process/census/completeOrder",
+//   });
+// ;
+const data1 = ref(
+  useCrud({
+    src: "/api/v1/process/census/completeOperation",
+  })
+);
+const data2 = ref(
+  useCrud({
+    src: "/api/v1/process/census/operationList",
+  })
+);
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+  data1.value.Methords;
+
+const { selectionChange, multipleDelete } = data1.value.Methords;
+const chartsData1 = ref({});
+const chartsData2 = ref({});
+const chartSeriesData1 = ref([]);
+const labelOption = {
+  show: false,
+  position: "insideBottom",
+  distance: 15,
+  align: "left",
+  verticalAlign: "middle",
+  rotate: 90,
+  formatter: "{c}  {name|{a}}",
+  fontSize: 24,
+  rich: {
+    name: {},
+  },
+};
+
+const echartOption1 = ref({
+  title: {
+    text: "工序完成数量",
+  },
+  tooltip: {
+    trigger: "axis",
+    axisPointer: {
+      type: "shadow",
+    },
+  },
+  legend: {
+    // data: chartsData.value.orderCodes,
+    data: ["工序完成数量"],
+  },
+  xAxis: [
+    {
+      type: "value",
+    },
+  ],
+  yAxis: [
+    {
+      type: "category",
+      axisTick: { show: false },
+      data: [],
+    },
+  ],
+  // series: chartSeriesData1.value,
+  series: [
+    {
+      name: "工序完成数量",
+      type: "bar",
+      barGap: 0,
+      label: labelOption,
+      emphasis: {
+        focus: "series",
+      },
+      // data: chartsData1.value.total,
+    },
+  ],
+});
+const echartOption2 = ref({
+  title: {
+    text: "生产趋势图",
+  },
+  tooltip: {
+    trigger: "axis",
+    axisPointer: {
+      type: "shadow",
+    },
+  },
+  legend: {
+    data: [],
+  },
+  xAxis: [
+    {
+      type: "category",
+      axisTick: { show: false },
+      data: [],
+    },
+  ],
+  yAxis: [
+    {
+      type: "value",
+    },
+  ],
+  toolbox: {
+    feature: {
+      saveAsImage: {},
+    },
+  },
+  series: [
+    {
+      name: "工序完成数量",
+      type: "line",
+      barGap: 0,
+      label: labelOption,
+      emphasis: {
+        focus: "series",
+      },
+      data: [],
+    },
+  ],
+});
+
+const ckickCell = (row) => {
+  editDialog.value.visible = true;
+  editDialog.value.title = row.orderName;
+  nextTick(async () => {
+    charts2.value = echarts.init(
+      document.getElementById("dailystoragecharts2")
+    );
+    chartsSearch.value.operationCode = row.operationCode;
+    chartsSearch.value.orderCode = row.orderCode;
+    chartsSearch.value.searchTime = data1.value.search.searchTime;
+    echartOption2.value.title.text = row.orderName + ": 生产趋势图";
+    await setChartsData2();
+    echartOption2.value.xAxis[0].data = chartsData2.value.dateList;
+    echartOption2.value.series[0].data = chartsData2.value.total;
+    charts2.value.setOption(echartOption2.value, true);
+  });
+};
+const setChartsData1 = async () => {
+  const { data } = await getOperationList({
+    ...data1.value.search,
+    pageSize: 99999,
+  });
+  chartsData1.value = data;
+};
+const setChartsData2 = async () => {
+  const { data } = await getOperationInfo({
+    ...chartsSearch.value,
+  });
+  chartsData2.value = data;
+};
+// 设置表格列或者其他自定义的option
+data1.value.option = Object.assign(data1.value.option, {
+  selection: false,
+  menu: true,
+  menuWidth: 100,
+  addBtn: false,
+  filterBtn: false,
+  searchShowBtn: false,
+  columnBtn: false,
+  gridBtn: false,
+  editBtn: false,
+  viewBtn: false,
+  delBtn: false,
+  column: [
+    {
+      label: "日期范围",
+      prop: "searchTime",
+      search: true,
+      hide: true,
+      type: "date",
+      format: "YYYY-MM-DD",
+      valueFormat: "YYYY-MM-DD",
+      searchRange: true,
+      startPlaceholder: "开始日期",
+      endPlaceholder: "结束日期",
+    },
+    {
+      label: "订单编码",
+      prop: "orderCode",
+      overHidden: true,
+      search: true,
+      editDisabled: true,
+      hide: true,
+    },
+    {
+      label: "订单名称",
+      prop: "orderName",
+      overHidden: true,
+      search: true,
+      editDisabled: true,
+      hide: true,
+    },
+    {
+      label: "项目编码",
+      prop: "projectCode",
+      overHidden: true,
+      search: true,
+      editDisabled: true,
+      hide: true,
+    },
+    {
+      label: "产品规格",
+      prop: "materialModel",
+      width: 140,
+      overHidden: true,
+      search: true,
+      editDisabled: true,
+      hide: true,
+    },
+    {
+      label: "订单名称",
+      prop: "orderName",
+      search: false,
+    },
+    {
+      label: "订单编码",
+      prop: "orderCode",
+      search: false,
+    },
+    {
+      label: "项目编码",
+      prop: "projectCode",
+      search: false,
+    },
+    {
+      label: "物料编码",
+      prop: "materialCode",
+      search: false,
+    },
+    {
+      label: "物料名称",
+      prop: "materialName",
+      search: false,
+    },
+    {
+      label: "物料规格",
+      prop: "materialModel",
+      search: false,
+    },
+    {
+      label: "工序编码",
+      prop: "operationCode",
+      search: false,
+    },
+    {
+      label: "工序名称",
+      prop: "operationName",
+      search: false,
+    },
+    {
+      label: "完工日期",
+      prop: "realEndWhen",
+      search: false,
+    },
+    {
+      label: "总完工数量",
+      prop: "total",
+      search: false,
+    },
+  ],
+});
+
+const getCurrentMonthStartAndEndDates = () => {
+  // 获取当前日期
+  let now = new Date();
+
+  // 获取当前月份的第一天
+  let startDate = new Date(now.getFullYear(), now.getMonth(), 1);
+
+  // 获取当前月份的最后一天
+  let endDate = new Date(now.getFullYear(), now.getMonth() + 1, 0);
+
+  // 格式化日期为'YYYY-MM-DD'格式
+  function formatDate(date) {
+    let year = date.getFullYear();
+    let month = String(date.getMonth() + 1).padStart(2, "0");
+    let day = String(date.getDate()).padStart(2, "0");
+    return `${year}-${month}-${day}`;
+  }
+
+  // 返回包含开始和结束日期的数组
+  return [formatDate(startDate), formatDate(endDate)];
+};
+
+//设置搜索条件中的时间范围为默认此月
+const setTime = () => {
+  data1.value.search.searchTime = getCurrentMonthStartAndEndDates();
+};
+
+onMounted(async () => {
+  setTime();
+  charts.value = echarts.init(document.getElementById("dailystoragecharts"));
+
+  dataList();
+  await setChartsData1();
+  echartOption1.value.yAxis[0].data = chartsData1.value.operationList;
+  echartOption1.value.series[0].data = chartsData1.value.total;
+  charts.value.setOption(echartOption1.value, true);
+});
+</script>
+<style lang="scss" scoped>
+:deep(.avue-crud__left) {
+  width: 100%;
+}
+
+#dailystoragecharts {
+  width: 100%;
+  height: 400px;
+  border: 1px solid #ccc;
+}
+
+#dailystoragecharts2 {
+  width: 100%;
+  height: 400px;
+  border: 1px solid #ccc;
+}
+</style>