From a749b62894ec0dcda3bb055371bc75db75f17ce1 Mon Sep 17 00:00:00 2001
From: 13404089107 <puwei@sinata.cn>
Date: 星期一, 12 五月 2025 17:46:57 +0800
Subject: [PATCH] Merge branch 'main' of http://120.76.84.145:10101/gitblit/r/H5/leshan-laboratory

---
 laboratory/src/views/dataManagement/dispatching/editDispatch.vue |  350 ++++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 232 insertions(+), 118 deletions(-)

diff --git a/laboratory/src/views/dataManagement/dispatching/editDispatch.vue b/laboratory/src/views/dataManagement/dispatching/editDispatch.vue
index f64befd..713e385 100644
--- a/laboratory/src/views/dataManagement/dispatching/editDispatch.vue
+++ b/laboratory/src/views/dataManagement/dispatching/editDispatch.vue
@@ -27,14 +27,30 @@
                   </div>
                 </div>
                 <div style="padding-left: 25px">
-                  <el-form-item prop="planName" label="项目课题方案名称">
-                    <el-input v-model="form.planName" placeholder="请输入" />
+                  <el-form-item prop="projectName" label="项目课题方案名称">
+                    <el-input
+                      v-model="form.projectName"
+                      placeholder="请输入"
+                      :disabled="true"
+                    />
                   </el-form-item>
-                  <el-form-item prop="planCode" label="项目课题方案编号">
-                    <el-input v-model="form.planCode" placeholder="请输入" />
+                  <el-form-item prop="projectCode" label="项目课题方案编号">
+                    <el-input
+                      v-model="form.projectCode"
+                      placeholder="请输入"
+                      :disabled="true"
+                    />
                   </el-form-item>
-                  <el-form-item prop="stage" label="项目阶段">
-                    <el-input v-model="form.stage" placeholder="请输入" />
+                  <el-form-item prop="projectStage" label="项目阶段">
+                    <el-select
+                      v-model="form.projectStage"
+                      disabled
+                      placeholder="请选择"
+                    >
+                      <el-option label="实验室开发阶段" :value="1" />
+                      <el-option label="中式试验阶段" :value="2" />
+                      <el-option label="生产验证试验阶段" :value="3" />
+                    </el-select>
                   </el-form-item>
                 </div>
 
@@ -45,19 +61,30 @@
                   </div>
                 </div>
                 <div style="padding-left: 25px">
-                  <el-form-item prop="testDate" label="试验日期">
+                  <el-form-item prop="experimentDate" label="实验日期">
                     <el-date-picker
-                      v-model="form.testDate"
+                      name="data-test"
+                      style="width: 100%"
+                      v-model="form.experimentDate"
                       type="date"
                       placeholder="选择日期"
                       value-format="yyyy-MM-dd"
+                      :disabled="true"
+                    ></el-date-picker>
+                  </el-form-item>
+                  <el-form-item prop="experimentName" label="实验名称">
+                    <el-input
+                      v-model="form.experimentName"
+                      placeholder="请输入"
+                      :disabled="true"
                     />
                   </el-form-item>
-                  <el-form-item prop="testName" label="实验名称">
-                    <el-input v-model="form.testName" placeholder="请输入" />
-                  </el-form-item>
-                  <el-form-item prop="testCode" label="实验编号">
-                    <el-input v-model="form.testCode" placeholder="请输入" />
+                  <el-form-item prop="experimentCode" label="实验编号">
+                    <el-input
+                      v-model="form.experimentCode"
+                      placeholder="请输入"
+                      :disabled="true"
+                    />
                   </el-form-item>
                 </div>
 
@@ -89,50 +116,49 @@
                   </div>
                 </div>
                 <div style="padding-left: 25px">
-                  <el-form-item prop="testTime" label="试验时间">
+                  <el-form-item prop="experimentTime" label="试验时间">
                     <el-date-picker
-                      v-model="form.testTime"
-                      type="datetime"
-                      placeholder="选择日期时间"
+                      style="width: 100%"
+                      v-model="form.experimentTime"
+                      type="datetimerange"
+                      range-separator="至"
+                      start-placeholder="开始时间"
+                      end-placeholder="结束时间"
                       value-format="yyyy-MM-dd HH:mm:ss"
-                    />
+                      :default-time="['00:00:00', '23:59:59']"
+                      :disabled="true"
+                    ></el-date-picker>
                   </el-form-item>
                 </div>
+
                 <div class="add-group">
                   <div>*</div>
                   <span>参加人员</span>
                 </div>
                 <div class="member-list">
-                  <div v-for="item in 3" :key="item" class="member-list-card">
+                  <div
+                    v-for="item in [3, 4, 5]"
+                    :key="item"
+                    class="member-list-card"
+                  >
                     <div class="member-item">
                       <div class="member-title">
-                        {{ ["工艺工程师", "实验员", "化验师"][item - 1] }}
+                        {{ ["工艺工程师", "化验师", "实验员"][item - 3] }}
                       </div>
-                      <div
-                        :class="
-                          item == 1 || item == 2 || item == 3
-                            ? 'member-name-box'
-                            : 'flex1'
-                        "
-                      >
+                      <div :class="item == 3 ? 'member-name-box' : 'flex1'">
                         <div
                           :class="
-                            item == 1 || item == 2 || item == 3
-                              ? 'member-name-box'
-                              : 'member-name-box-2'
+                            item == 3 ? 'member-name-box' : 'member-name-box-2'
                           "
                         >
                           <div
                             v-for="i in memberList(item)"
-                            :key="i"
+                            :key="i.userId"
                             class="member-name"
                           >
-                            张三
+                            {{ i.nickName }}
                           </div>
                         </div>
-                      </div>
-                      <div class="member-change" v-if="type !== 'view'">
-                        <div class="member-change-btn">修改</div>
                       </div>
                     </div>
                   </div>
@@ -161,7 +187,7 @@
                     label="任务名称"
                   ></el-table-column>
                   <el-table-column
-                    prop="leader"
+                    prop="personCharge"
                     label="负责人"
                   ></el-table-column>
                   <el-table-column
@@ -176,6 +202,14 @@
                     <span>五 、关键节点</span>
                   </div>
                 </div>
+                <div style="padding-left: 25px">
+                  <AIEditor
+                    ref="keyNodesEditor"
+                    :readOnly="true"
+                    :value="form.keyNodes"
+                    height="200"
+                  />
+                </div>
               </el-form>
             </template>
           </Card>
@@ -183,13 +217,7 @@
         <!-- 右侧审批流程 -->
         <div class="approval-flow" v-if="type === 'view'">
           <div class="flow-content">
-            <approval-process
-              mode="card"
-              :status="form.status"
-              :submit-time="form.createTime"
-              :approver="form.approver"
-              :approve-time="form.approveTime"
-            />
+            <approval-process :processData="form.processData" />
           </div>
         </div>
       </div>
@@ -225,6 +253,7 @@
     <SignatureCanvas
       :visible="signatureDialogVisible"
       @confirm="handleSignatureConfirm"
+      @close="signatureDialogVisible = false"
     />
   </div>
 </template>
@@ -232,12 +261,15 @@
 <script>
 import ApprovalProcess from "@/components/approvalProcess";
 import SignatureCanvas from "@/components/SignatureCanvas.vue";
+import AIEditor from "@/components/AiEditor";
+import { getDetailById, sign } from "./service";
 
 export default {
   name: "ApprovalDialog",
   components: {
     ApprovalProcess,
     SignatureCanvas,
+    AIEditor,
   },
   props: {
     visible: {
@@ -256,55 +288,57 @@
   data() {
     return {
       form: {
-        planName: "",
-        planCode: "",
-        stage: "",
-        testDate: "",
-        testName: "",
-        testCode: "",
-        testTime: "",
-        creator: "",
-        createTime: "",
-        approvalComment: "",
-        status: "approved",
-        approver: "",
-        approveTime: "",
+        projectName: "",
+        projectCode: "",
+        projectStage: "",
+        experimentName: "",
+        experimentCode: "",
+        experimentDate: "",
+        experimentTime: [],
+        status: "",
+        experimentDispatchGroups: [],
+        experimentDispatchParticipants: [],
+        experimentDispatchTasks: [],
+        keyNodes: "",
+        processData: [],
       },
       rules: {
-        planName: [
+        projectName: [
           {
             required: true,
             message: "请输入项目课题方案名称",
             trigger: "blur",
           },
         ],
-        planCode: [
+        projectCode: [
           {
             required: true,
             message: "请输入项目课题方案编号",
             trigger: "blur",
           },
         ],
-        stage: [{ required: true, message: "请输入项目阶段", trigger: "blur" }],
-        testDate: [
-          { required: true, message: "请选择试验日期", trigger: "change" },
-        ],
-        testName: [
+        experimentName: [
           { required: true, message: "请输入实验名称", trigger: "blur" },
         ],
-        testCode: [
+        experimentCode: [
           { required: true, message: "请输入实验编号", trigger: "blur" },
         ],
-        testTime: [
-          { required: true, message: "请选择试验时间", trigger: "change" },
+        experimentDate: [
+          { required: true, message: "请选择实验日期", trigger: "change" },
+        ],
+        experimentTime: [
+          { required: true, message: "请选择实验时间范围", trigger: "change" },
         ],
       },
       imgSrc: "",
       signatureDialogVisible: false,
-      status: "1",
-      remark: "",
       groupTableData: [],
       taskTableData: [],
+      members: {
+        processEngineer: [], // 工艺工程师
+        experimenter: [], // 实验员
+        analyst: [], // 化验师
+      },
     };
   },
   computed: {
@@ -316,75 +350,154 @@
     data: {
       handler(val) {
         if (val) {
-          this.form = { ...val };
+          this.getDetail(val.id);
         }
       },
       immediate: true,
     },
   },
   methods: {
-    memberList(i) {
-      switch (i) {
-        case 1:
-          return [1];
-        case 2:
-          return [1];
-        case 3:
-          return [1, 2, 3, 4, 5, 6, 7, 8];
-        case 4:
-          return [1, 2, 3, 4, 5, 6, 7, 8];
+    // 获取详情
+    getDetail(id) {
+      getDetailById({ id })
+        .then((res) => {
+          if (res) {
+            const data = res;
+            // 设置表单数据
+            this.form = {
+              projectName: data.projectName,
+              projectCode: data.projectCode,
+              projectStage: data.projectStage,
+              experimentName: data.experimentName,
+              experimentCode: data.experimentCode,
+              experimentDate: data.experimentDate,
+              experimentTime: [
+                data.experimentStartTime,
+                data.experimentEndTime,
+              ],
+              status: data.status,
+              experimentDispatchGroups: data.experimentDispatchGroups || [],
+              experimentDispatchParticipants:
+                data.experimentDispatchParticipants || [],
+              experimentDispatchTasks: data.experimentDispatchTasks || [],
+              keyNodes: data.keyNodes,
+              processData: [],
+            };
+
+            // 设置表格数据
+            this.groupTableData = data.experimentDispatchGroups || [];
+            this.taskTableData = data.experimentDispatchTasks || [];
+
+            // 处理参与人员数据
+            this.members = {
+              processEngineer:
+                data.experimentDispatchParticipants.filter(
+                  (p) => p.roleType === 3
+                ) || [],
+              experimenter:
+                data.experimentDispatchParticipants.filter(
+                  (p) => p.roleType === 5
+                ) || [],
+              analyst:
+                data.experimentDispatchParticipants.filter(
+                  (p) => p.roleType === 4
+                ) || [],
+            };
+
+            // 组装流程数据
+            let processData = [];
+            // 提交节点
+            processData.push({
+              type: "primary",
+              mode: "list",
+              fields: [
+                { label: "提交人:", value: data.createBy || "" },
+                { label: "提交时间:", value: data.createTime || "" },
+              ],
+            });
+
+            // 处理参与人员数据,按角色分类
+            const participants = data.experimentDispatchParticipants || [];
+            const analyst = participants.filter((p) => p.roleType === 4); // 化验师
+            const experimenter = participants.filter((p) => p.roleType === 5); // 实验员
+
+            // 添加确认节点
+            processData.push({
+              type: "success",
+              mode: "card",
+              groups: [
+                {
+                  title: "化验师",
+                  members: analyst.map((item) => ({
+                    name: item.nickName || "",
+                    status: item.status === 2 ? "已确认" : "待确认",
+                    approveTime: item.status === 2 ? item.signTime : "",
+                    avatar: item.avatar || "",
+                  })),
+                },
+                {
+                  title: "实验员",
+                  members: experimenter.map((item) => ({
+                    name: item.nickName || "",
+                    status: item.status === 2 ? "已确认" : "待确认",
+                    approveTime: item.status === 2 ? item.signTime : "",
+                    avatar: item.avatar || "",
+                  })),
+                },
+              ],
+            });
+
+            this.form.processData = processData;
+          }
+        })
+        .catch((err) => {
+          console.error("获取详情失败:", err);
+          this.$message.error("获取详情失败");
+        });
+    },
+    memberList(type) {
+      switch (type) {
+        case 3: // 工艺工程师
+          return this.members.processEngineer;
+        case 5: // 实验员
+          return this.members.experimenter;
+        case 4: // 化验师
+          return this.members.analyst;
         default:
-          break;
+          return [];
       }
     },
     handleClose() {
-      this.$emit("update:visible", false);
-      this.form.approvalComment = "";
+      this.$emit("close", false);
+      this.signatureDialogVisible = false;
+      this.imgSrc = '';
     },
     handleApprove() {
-      if (!this.form.approvalComment) {
-        this.$message.warning("请输入审批意见");
-        return;
-      }
-      this.$emit("approve", {
-        ...this.form,
-        status: "approved",
+      // 组装签名数据
+      const params = {
+        id: this.data.id, // 传递当前调度id
+        signImg: this.imgSrc, // 签名图片
+      };
+      sign(params).then(res => {
+        if (res && res.code === 200) {
+          this.$message.success('签字成功');
+          this.handleClose();
+        } else {
+          this.$message.error(res.msg || '签字失败');
+        }
+      }).catch(() => {
+        this.$message.error('签字失败');
       });
-    },
-    handleReject() {
-      if (!this.form.approvalComment) {
-        this.$message.warning("请输入审批意见");
-        return;
-      }
-      this.$emit("reject", {
-        ...this.form,
-        status: "rejected",
-      });
-    },
-    memberList(item) {
-      return item === 1 ? 2 : item === 2 ? 3 : 1;
     },
     openSignature() {
       this.signatureDialogVisible = true;
     },
     handleSignatureConfirm(imageData) {
-      console.log("imageData imageData", imageData);
       this.signatureDialogVisible = false;
-      this.imgSrc = imageData;
-
-      // 这里处理签名确认后的逻辑
-      // this.$confirm('确认该实验调度吗?', '提示', {
-      //   confirmButtonText: '确定',
-      //   cancelButtonText: '取消',
-      //   type: 'warning'
-      // }).then(() => {
-      //   // 这里可以将签名图片数据(imageData)连同其他数据一起提交到后端
-      //   this.$message.success('确认成功');
-      //   this.signatureDialogVisible = false;
-      //   this.getTableData();
-      // }).catch(() => {
-      //   this.signatureDialogVisible = false;
-      // });
+      // 模拟上传签名图片,实际应调用上传接口,成功后回显图片链接
+      // TODO: 替换为实际上传接口
+      // uploadSignature(imageData).then(url => { this.imgSrc = url })
+      this.imgSrc = 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg'; // 默认图片链接
     },
   },
 };
@@ -488,6 +601,7 @@
 }
 
 .header-title:first-child {
+  margin-top: 0;
   .header-title-left {
     margin-top: 0;
   }

--
Gitblit v1.7.1