33
schangxiang@126.com
2025-05-18 daf2a4075e8ce949cda132de6a03b7ea86597b37
33
已添加2个文件
已修改7个文件
875 ■■■■■ 文件已修改
PipeLineLems/pipelinelems_web/src/config/menu.ts 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/Service/PipeAccessoryAssembly.ts 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/PipeAccessoryAssembly/PipeAccessoryAssembly.tsx 100 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/WorkPlan/Views/Pages/WorkPlan/Config.ts 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Dtos/WorkPlan/CompleteAssemblyProcessInput.cs 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Dtos/WorkPlan/StartProductionInput.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/SharedService.cs 459 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems/Controller/WorkPlanPublicController.cs 98 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems/ProjectService/PipeLineLemsProjectService.cs 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/config/menu.ts
@@ -14,17 +14,17 @@
    "notPage": false
  },
  {
    "name": "工单管理(新)",
    "path": "/information-base/OrderManagement-main",
    "patchName": "OrderManagement-main",
    "icon": "order",
    "notPage": false
  },
  {
    "name": "MyPluginName",
    "path": "/information-base/MyPluginName",
    "patchName": "MyPluginName",
    "icon": "p",
    "notPage": false
  },
  {
    "name": "工单管理(新)",
    "path": "/information-base/OrderManagement-main",
    "patchName": "OrderManagement-main",
    "icon": "order",
    "notPage": false
  },
  {
@@ -64,13 +64,6 @@
    "icon": "p",
    "notPage": false
  },
  "OrderManagement-main": {
    "name": "工单管理(新)",
    "path": "/information-base/OrderManagement-main",
    "patchName": "OrderManagement-main",
    "icon": "order",
    "notPage": false
  },
  "MyPluginName": {
    "name": "MyPluginName",
    "path": "/information-base/MyPluginName",
@@ -78,6 +71,13 @@
    "icon": "p",
    "notPage": false
  },
  "OrderManagement-main": {
    "name": "工单管理(新)",
    "path": "/information-base/OrderManagement-main",
    "patchName": "OrderManagement-main",
    "icon": "order",
    "notPage": false
  },
  "Http": {
    "name": "API请求",
    "path": "/information-base/Http",
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/Service/PipeAccessoryAssembly.ts
@@ -61,3 +61,19 @@
export const findSingleWorkPlanByFilter = (data: any) => {
  return request.post('/api/v1/PipeLineLems/WorkPlan/FindSingleByFilter', data)
}
/**
 * æ ¹æ® ä»»åŠ¡ç¼–å·è¿›è¡Œå¼€å·¥
 * @returns
 */
export const startProduction  = (data: any) => {
  return request.post('/api/v1/PipeLineLems/WorkPlanPublic/startProduction', data)
}
/**
 * æ ¹æ® ä»»åŠ¡ç¼–å·è¿›è¡Œå®Œå·¥
 * @returns
 */
export const finishProduction  = (data: any) => {
  return request.post('/api/v1/PipeLineLems/WorkPlanPublic/finishProduction', data)
}
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/PipeAccessoryAssembly/PipeAccessoryAssembly.tsx
@@ -2,6 +2,7 @@
import type { Ref } from 'vue'
import styles from './PipeAccessoryAssembly.module.scss'
import pipeImage from '@/images/pipe-assembly-drawing-example.png'
import { ConfirmBox } from '@/components/ConfirmBox/ConfirmBox'
import {
  ElInput,
  ElForm,
@@ -16,7 +17,9 @@
  getPlaceNoForStockList,
  getMaterialModelList,
  instock,
  findSingleWorkPlanByFilter
  findSingleWorkPlanByFilter,
  startProduction,
  finishProduction
} from '@/widgets/PipeAccessoryAssembly/Models/Service/PipeAccessoryAssembly'
import { Message } from '@element-plus/icons-vue/dist/types'
@@ -123,13 +126,74 @@
      }
    };
    // å¼€å·¥äº‹ä»¶å¤„理
    const startWork = () => {
      console.log('执行开工操作');
      if(queryForm.value.pipeSpecCode==''){
        ElMessage.error('请输入管段编码');
        return
      }
      ConfirmBox(
                `确定要将管段编码${queryForm.value.pipeSpecCode}开工吗`
              ).then(async () => {
                //您的业务逻辑
                const param={
                  taskCode:queryForm.value.taskCode,
                };
                const ret = await startProduction(param);
      console.log('返回:'+ret);
                if(ret.code="200"){
                  ElMessage.success('开工成功');
                }else{
                  ElMessage.error('开工失败:'+ret.message);
                }
              })
    }
    // å®Œå·¥äº‹ä»¶å¤„理
    const finishWork = () => {
      console.log('执行开工操作');
      if(queryForm.value.pipeSpecCode==''){
        ElMessage.error('请输入管段编码');
        return
      }
      ConfirmBox(
                `确定要将管段编码${queryForm.value.pipeSpecCode}完工吗`
              ).then(async () => {
                //您的业务逻辑
                const param={
                  pipeSpecCode:queryForm.value.pipeSpecCode,
                  processName:queryForm.value.processName,
                };
                const ret = await finishProduction(param);
      console.log('返回:'+ret);
                if(ret.code="200"){
                  ElMessage.success('完工成功');
                }else{
                  ElMessage.error('完工失败:'+ret.message);
                }
              })
    }
    const tableData = ref([
      { sequence: 1, flangeA: 'RF-200-1.6MPa', flangeB: 'WN-200-1.6MPa' },
      { sequence: 2, flangeA: 'WN-250-2.5MPa', flangeB: 'SO-250-2.5MPa' },
      { sequence: 3, flangeA: 'PL-300-1.0MPa', flangeB: 'RF-300-1.0MPa' },
      { sequence: 4, flangeA: 'SO-150-2.0MPa', flangeB: 'WN-150-2.0MPa' },
      { sequence: 5, flangeA: 'RF-400-1.6MPa', flangeB: 'PL-400-1.6MPa' },
      { sequence: 6, flangeA: 'WN-200-4.0MPa', flangeB: 'SO-200-4.0MPa' },
      { sequence: 7, flangeA: 'SO-300-1.6MPa', flangeB: 'RF-300-1.6MPa' },
      { sequence: 8, flangeA: 'PL-250-1.0MPa', flangeB: 'WN-250-1.0MPa' },
      { sequence: 9, flangeA: 'RF-150-2.5MPa', flangeB: 'SO-150-2.5MPa' },
      { sequence: 10, flangeA: 'WN-400-2.0MPa', flangeB: 'PL-400-2.0MPa' }
    ]);
    return () => {
      return (
        <div
          class={styles.PipeAccessoryAssemblyContent}
          style="overflow-y: auto !important;  height: 100%;"
        >
             <ElFormItem label="管段编号">
             <ElFormItem label="管段编码&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
                  <ElInput
                    v-model={queryForm.value.pipeSpecCode}
                    clearable
@@ -138,8 +202,8 @@
                  />
                </ElFormItem>
          <div class={styles.actionButtons}>
            <ElButton type="warning">开工</ElButton>
            <ElButton type="warning">完工</ElButton>
            <ElButton type="warning" onClick={startWork}>开工</ElButton>
            <ElButton type="warning" onClick={finishWork}>完工</ElButton>
            <ElButton type="warning">暂停</ElButton>
            <ElButton type="warning">自动</ElButton>
            <ElButton type="warning">质检</ElButton>
@@ -148,7 +212,7 @@
          <h2 class={styles.blockTitle}>当前任务</h2>
          <ElForm label-position="left" >
             
                <ElFormItem label="物料流向">
                <ElFormItem label="物料流向&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
                  <ElInput
                    v-model={queryForm.value.processRouteNumber}
                    disabled
@@ -156,7 +220,7 @@
                    class={styles.formInput}
                  />
                </ElFormItem>
                <ElFormItem label="任务编号">
                <ElFormItem label="任务编号&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
                  <ElInput
                    v-model={queryForm.value.taskCode}
                    disabled
@@ -164,7 +228,7 @@
                    class={styles.formInput}
                  />
                </ElFormItem>
                <ElFormItem label="管段长度">
                <ElFormItem label="管段长度&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
                  <ElInput
                    v-model={queryForm.value.length}
                    disabled
@@ -172,7 +236,7 @@
                    class={styles.formInput}
                  />
                </ElFormItem>
                <ElFormItem label="项目号">
                <ElFormItem label="项目&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;号">
                  <ElInput
                    v-model={queryForm.value.projectNumber}
                    disabled
@@ -180,7 +244,7 @@
                    class={styles.formInput}
                  />
                </ElFormItem>
                <ElFormItem label="船号">
                <ElFormItem label="船&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;号">
                  <ElInput
                    v-model={queryForm.value.shipNumber}
                    disabled
@@ -188,7 +252,7 @@
                    class={styles.formInput}
                  />
                </ElFormItem>
                <ElFormItem label="材质">
                <ElFormItem label="材&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;è´¨">
                  <ElInput
                    v-model={queryForm.value.material}
                    disabled
@@ -196,7 +260,7 @@
                    class={styles.formInput}
                  />
                </ElFormItem>
                <ElFormItem label="外径">
                <ElFormItem label="外&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;径">
                  <ElInput
                    v-model={queryForm.value.outerDiameter}
                    disabled
@@ -204,7 +268,7 @@
                    class={styles.formInput}
                  />
                </ElFormItem>
                <ElFormItem label="壁         &nbsp;&nbsp;&nbsp;厚">
                <ElFormItem label="壁&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;厚">
                  <ElInput
                    v-model={queryForm.value.thickness}
                    disabled
@@ -232,7 +296,7 @@
              <h2 class={styles.blockTitle}>当前工位/设备信息</h2>
          <ElForm label-position="left" >
                <ElFormItem label="工位代码">
                <ElFormItem label="工位代码&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
                  <ElInput
                    v-model={queryForm.value.workstationCode}
                    disabled
@@ -240,7 +304,7 @@
                    class={styles.formInput}
                  />
                </ElFormItem>
                <ElFormItem label="工序名称">
                <ElFormItem label="工序名称&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
                  <ElInput
                    v-model={queryForm.value.processName}
                    disabled
@@ -248,7 +312,7 @@
                    class={styles.formInput}
                  />
                </ElFormItem>
                <ElFormItem label="设备代码">
                <ElFormItem label="设备代码&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
                  <ElInput
                    v-model={queryForm.value.equipmentCode}
                    disabled
@@ -274,14 +338,14 @@
                </ElFormItem> */}
              </ElForm>
          <div class="info-block">
          {/* <div class="info-block">
            <h2 class="block-title">工艺信息</h2>
            <el-table stripe>
            <el-table stripe  v-model:dataSource={tableData}>
              <el-table-column prop="sequence" label="序"></el-table-column>
              <el-table-column prop="flangeA" label="法兰A"></el-table-column>
              <el-table-column prop="flangeB" label="法兰B"></el-table-column>
            </el-table>
          </div>
          </div> */}
          <h2 class="block-title">图纸</h2>
          <img
            src={pipeImage}
PipeLineLems/pipelinelems_web/src/widgets/WorkPlan/Views/Pages/WorkPlan/Config.ts
@@ -10,6 +10,21 @@
  width:160, 
}, 
  field: 'pipeSpecCode',
  title: '管段编码',
  width:160,
},
{
  field: 'pipeSectionName',
  title: '管段名称',
  width:160,
},
{
  field: 'processName',
  title: '工序名称',
  width:160,
},
{
  field: 'workPlanStatusDesc', 
  title: '计划状态', 
  width:160, 
@@ -119,11 +134,7 @@
  title: '项目号', 
  width:160, 
}, 
{
  field: 'processName',
  title: '工序名称',
  width:160,
},
  field: 'pipeFittingCode', 
  title: '管件编码', 
@@ -134,16 +145,7 @@
  title: '顺序号', 
  width:160, 
}, 
{
  field: 'pipeSpecCode',
  title: '管段编码',
  width:160,
},
{
  field: 'pipeSectionName',
  title: '管段名称',
  width:160,
},
  field: 'outerDiameter', 
  title: '外径(mm)', 
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Dtos/WorkPlan/CompleteAssemblyProcessInput.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CMS.Plugin.PipeLineLems.Application.Contracts.Dtos.WorkPlan
{
    /// <summary>
    /// è£…配工序完工 è¾“入参数模型
    /// </summary>
    [Serializable]
    public class CompleteAssemblyProcessInput
    {
        /// <summary>
        /// ç®¡æ®µç¼–码
        /// </summary>
        public string PipeSpecCode { get; set; }
        /// <summary>
        /// å·¥åºåç§°
        /// </summary>
        public string ProcessName { get; set; }
    }
}
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Dtos/WorkPlan/StartProductionInput.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CMS.Plugin.PipeLineLems.Application.Contracts.Dtos.WorkPlan
{
    /// <summary>
    /// å¼€å·¥è¾“入参数模型
    /// </summary>
    [Serializable]
    public class StartProductionInput
    {
        /// <summary>
        /// ä»»åŠ¡ç¼–ç 
        /// </summary>
        public string TaskCode { get; set; }
        ///// <summary>
        ///// å·¥åºåç§°
        ///// </summary>
        //public string ProcessName { get; set; }
    }
}
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/SharedService.cs
@@ -61,6 +61,7 @@
        var traceProvider = _serviceProvider.GetRequiredService<ITraceProvider>();
        var materialProvider = _serviceProvider.GetRequiredService<IMaterialProvider>();
        var workPlanAppService = _serviceProvider.GetRequiredService<IWorkPlanAppService>();
        var callMaterialOrderAppService = _serviceProvider.GetRequiredService<ICallMaterialOrderAppService>();
        //Dictionary<string, object?> keyValuePairs = new Dictionary<string, object?>
        //            {
@@ -103,6 +104,9 @@
        var firstWorkPlans = await workPlanAppService.GetListByFilterAsync(x => x.PipeSpecCode == input.PipeSpecCode);
        var firstWorkPlan = await workPlanAppService.GetSingleByFilterAsync(x => x.PipeSpecCode == input.PipeSpecCode);
        var callMaterialOrder = await callMaterialOrderAppService.GetSingleByFilterAsync(x => x.DataIdentifier == firstWorkPlan.DataIdentifier);
        var rawPipe_DataIdentifier = await materialProvider.FindByNameAsync("原料管标识");
        var rawPipe_MaterialMode = await materialProvider.FindByNameAsync("原料管型号");
        var rawPipe_Batch = await materialProvider.FindByNameAsync("原料管批次");
@@ -141,7 +145,7 @@
                    Quantity = 1,
                    MaterialId = rawPipe_Batch.MaterialId,
                    MaterialDetailId = rawPipe_Batch.MaterialDetails.First().Id,
                    Value = "111",//批次暂时写死
                    Value = callMaterialOrder.MaterialBatch,//批次暂时写死
                });
            }
@@ -154,7 +158,30 @@
            string _value = "";
            if (item.Name == "分拣方向")
            {
                _value = "短管装配";
                _value = "短管分拣";
            }
            if (item.Name == "分拣托盘号")
            {
                _value = input.ContinerNo;
            }
            if (item.Name == "分拣人")
            {
                _value = myCurrentUser.UserAccount;
            }
            //item.Key
            TraceParamModel traceParamModel = new TraceParamModel()
            {
                Key = item.Key,
                Value = _value
            };
            traceModel.Params.Add(traceParamModel);
        };
        foreach (var item in workSection.FormulaParameters)
        {
            string _value = "";
            if (item.Name == "分拣方向")
            {
                _value = "短管分拣";
            }
            if (item.Name == "分拣托盘号")
            {
@@ -566,6 +593,434 @@
    }
    /// <summary>
    ///装配/焊接开工
    /// </summary>
    /// <param name="input"></param>
    /// <param name="_serviceProvider"></param>
    /// <param name="myCurrentUser"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    public async Task<MesOrderResponse> StartProduction(StartProductionInput input, IServiceProvider _serviceProvider, MyCurrentUser myCurrentUser)
    {
        if (string.IsNullOrEmpty(input.TaskCode.ToString()))
        {
            throw new UserFriendlyException("任务编码不能为空");
        }
        string processName = "";
        VariableService _variableService = _serviceProvider.GetRequiredService<VariableService>();
        var callMaterialOrderRepository = _serviceProvider.GetRequiredService<ICallMaterialOrderRepository>();
        var workPlanRepository = _serviceProvider.GetRequiredService<IWorkPlanRepository>();
        var callMaterialOrderRecordRepository = _serviceProvider.GetRequiredService<ICallMaterialOrderRecordRepository>();
        var orderManager = _serviceProvider.GetRequiredService<IOrderManager>();
        var callMaterialOrderAppService = _serviceProvider.GetRequiredService<ICallMaterialOrderAppService>();
        // æŸ¥æ‰¾æ•°æ®
        var workPlan = await workPlanRepository.GetSingleByFilterAsync(x => x.TaskCode == input.TaskCode);
        if (workPlan == null)
        {
            throw new UserFriendlyException($"找不到作业计划");
        }
        if (workPlan.ProcessName == "装配工序")
        {
            processName = "装配";
        }
        else if (workPlan.ProcessName == "焊接工序")
        {
            processName = "焊接";
        }
        // éªŒè¯çŠ¶æ€
        if (workPlan.WorkPlanStatus != Domain.Shared.Enums.WorkPlanStatusEnum.暂停中 && workPlan.WorkPlanStatus != Domain.Shared.Enums.WorkPlanStatusEnum.未生产)
        {
            //暂时注释
            //throw new UserFriendlyException($"任务编码 '{input.TaskCode}' çš„录状态为 '{workPlan.WorkPlanStatus}',不允许开工");
        }
        var callMaterialOrder = await callMaterialOrderAppService.GetSingleByFilterAsync(x => x.DataIdentifier == workPlan.DataIdentifier);
        #region äº‹åŠ¡
        using var scope = _serviceProvider.CreateScope();
        var unitOfWorkManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>();
        using var uow = unitOfWorkManager.Begin(requiresNew: true);
        try
        {
            #region æ•°æ®å¤„理
            //1、更新作业计划表为 ç”Ÿäº§ä¸­
            //2、给PLC发工艺参数指令,并写入 plc中 äº§å“id
            //if (workPlan.ProcessName == "装配工序")
            //{
            //    workPlan.WorkPlanStatus = Domain.Shared.Enums.WorkPlanStatusEnum.生产中;
            //}
            //else if (workPlan.ProcessName == "焊接工序")
            //{
            //    workPlan.WorkPlanStatus = Domain.Shared.Enums.WorkPlanStatusEnum.已完成;
            //}
            if (workPlan.ProcessRouteNumber == "无")
            {
                workPlan.WorkPlanStatus = Domain.Shared.Enums.WorkPlanStatusEnum.已完成;
            }
            else
            {
                workPlan.WorkPlanStatus = Domain.Shared.Enums.WorkPlanStatusEnum.生产中;
            }
            await workPlanRepository.UpdateAsync(workPlan);
            Dictionary<string, object?> keyValuePairs = new Dictionary<string, object?>
                        {
                            { $"{processName}_ProductID", workPlan.PipeSpecCode },
                            { $"{processName}管段编码", workPlan.PipeSpecCode },
                            { $"{processName}管段名称", workPlan.PipeSectionName },
                            { $"{processName}原料管批次", callMaterialOrder.MaterialBatch },
                            { $"{processName}原料管型号", callMaterialOrder.MaterialMode },
                            { $"{processName}原料管标识", callMaterialOrder.DataIdentifier },
                            { $"{processName}项目号", workPlan.ProjectNumber },
                            { $"{processName}船号", workPlan.ShipNumber },
                            //采集数据模拟写入
                            { $"{processName}压力", "10.0 MPa" },
                            { $"{processName}速度", "18mm/s"},
                            { $"{processName}人", myCurrentUser.UserAccount},
                            { $"{processName}间隙","15mm"},
                            { $"{processName}位置", "10,23,24"},
                        };
            _variableService.WriteValueAsync(keyValuePairs);
            #endregion
            await uow.CompleteAsync();
            // è¿”回结果
            var response = new MesOrderResponse
            {
                Code = "200",
                Message = "处理成功",
                Time = DateTime.UtcNow
            };
            return response;
        }
        catch (Exception)
        {
            await uow.RollbackAsync();
            throw;
        }
        finally
        {
        }
        #endregion
    }
    /// <summary>
    /// è£…配工序完工
    /// </summary>
    /// <param name="_serviceProvider"></param>
    /// <param name="input"></param>
    /// <param name="myCurrentUser"></param>
    /// <returns></returns>
    public async Task<MesOrderResponse> CompleteAssemblyProcess(IServiceProvider _serviceProvider, CompleteAssemblyProcessInput input, MyCurrentUser myCurrentUser)
    {
        //1、记录分拣记录表
        //2、更新作业计划表的状态 =已分拣
        //3、写入 åˆ†æ‹£å˜é‡
        //4、写入追溯报表
        //5、物料组盘
        if (string.IsNullOrEmpty(input.PipeSpecCode))
        {
            throw new UserFriendlyException($"管段编码不能为空");
        }
        VariableService _variableService = _serviceProvider.GetRequiredService<VariableService>();
        var _workSectionManager = _serviceProvider.GetRequiredService<IWorkSectionManager>();
        var _workStationManager = _serviceProvider.GetRequiredService<IWorkStationManager>();
        var traceProvider = _serviceProvider.GetRequiredService<ITraceProvider>();
        var materialProvider = _serviceProvider.GetRequiredService<IMaterialProvider>();
        var workPlanAppService = _serviceProvider.GetRequiredService<IWorkPlanAppService>();
        var workPlanRepository = _serviceProvider.GetRequiredService<IWorkPlanRepository>();
        var callMaterialOrderAppService = _serviceProvider.GetRequiredService<ICallMaterialOrderAppService>();
        string processName = "";
        //物料参数列表
        var firstWorkPlan = await workPlanAppService.GetSingleByFilterAsync(x => x.PipeSpecCode == input.PipeSpecCode && x.ProcessName == input.ProcessName);
        if (firstWorkPlan == null)
        {
            throw new UserFriendlyException($"找不到作业计划");
        }
        if (firstWorkPlan.ProcessName == "装配工序")
        {
            processName = "装配";
        }
        else if (firstWorkPlan.ProcessName == "焊接工序")
        {
            processName = "焊接";
        }
        await CompleteHandleOutStoreFinish(_serviceProvider, processName, true);
        //根据工序名获取工序对象
        var workSection = await _workSectionManager.GetByNameAsync($"{processName}工序");
        var workStation = await _workStationManager.GetByNameAsync($"{processName}工位");
        //写入追溯报表
        var finishTime = DateTime.Now;
        TraceModel traceModel = new TraceModel()
        {
            SerialNumber = input.PipeSpecCode,
            WorkSectionId = workSection.Id,
            WorkSectionName = workSection.Name,
            WorkStationName = workStation.Name,
            FinishTime = finishTime,
            IsQualified = true,
            UnqualifiedReason = "",
            ProductModel = "",
            ProductName = "",
        };
        traceModel.Params = new List<TraceParamModel>();
        foreach (var item in workSection.ProcessParameters)
        {
            var value = "ssss";
            traceModel.Params.Add(new TraceParamModel()
            {
                Key = item.Key,
                Value = value.SafeString()
            });
        }
        #region äº‹åŠ¡
        using var scope = _serviceProvider.CreateScope();
        var unitOfWorkManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>();
        using var uow = unitOfWorkManager.Begin(requiresNew: true);
        try
        {
            #region æ•°æ®å¤„理
            firstWorkPlan.WorkPlanStatus = Domain.Shared.Enums.WorkPlanStatusEnum.已完成;
            await workPlanRepository.UpdateAsync(firstWorkPlan);
            var callMaterialOrder = await callMaterialOrderAppService.GetSingleByFilterAsync(x => x.DataIdentifier == firstWorkPlan.DataIdentifier);
            var rawPipe_DataIdentifier = await materialProvider.FindByNameAsync("原料管标识");
            var rawPipe_MaterialMode = await materialProvider.FindByNameAsync("原料管型号");
            var rawPipe_Batch = await materialProvider.FindByNameAsync("原料管批次");
            var rawPipe_ProjectNumber = await materialProvider.FindByNameAsync("项目号");
            var rawPipe_ShipNumber = await materialProvider.FindByNameAsync("船号");
            List<TraceMaterialModel> _MaterialParams = new List<TraceMaterialModel>();
            foreach (var item in workSection.MaterialParameters)
            {
                if (item.Name == "原料管型号")
                {
                    _MaterialParams.Add(new TraceMaterialModel()
                    {
                        Key = item.Key,
                        Quantity = 1,
                        MaterialId = rawPipe_MaterialMode.MaterialId,
                        MaterialDetailId = rawPipe_MaterialMode.MaterialDetails.First().Id,
                        Value = firstWorkPlan.MaterialMode
                    });
                }
                if (item.Name == "原料管标识")
                {
                    _MaterialParams.Add(new TraceMaterialModel()
                    {
                        Key = item.Key,
                        Quantity = 1,
                        MaterialId = rawPipe_DataIdentifier.MaterialId,
                        MaterialDetailId = rawPipe_DataIdentifier.MaterialDetails.First().Id,
                        Value = firstWorkPlan.DataIdentifier,
                    });
                }
                if (item.Name == "原料管批次")
                {
                    _MaterialParams.Add(new TraceMaterialModel()
                    {
                        Key = item.Key,
                        Quantity = 1,
                        MaterialId = rawPipe_Batch.MaterialId,
                        MaterialDetailId = rawPipe_Batch.MaterialDetails.First().Id,
                        Value = callMaterialOrder.MaterialBatch,//批次暂时写死
                    });
                }
                if (item.Name == "项目号")
                {
                    _MaterialParams.Add(new TraceMaterialModel()
                    {
                        Key = item.Key,
                        Quantity = 1,
                        MaterialId = rawPipe_ProjectNumber.MaterialId,
                        MaterialDetailId = rawPipe_ProjectNumber.MaterialDetails.First().Id,
                        Value = firstWorkPlan.ProjectNumber,
                    });
                }
                if (item.Name == "船号")
                {
                    _MaterialParams.Add(new TraceMaterialModel()
                    {
                        Key = item.Key,
                        Quantity = 1,
                        MaterialId = rawPipe_ShipNumber.MaterialId,
                        MaterialDetailId = rawPipe_ShipNumber.MaterialDetails.First().Id,
                        Value = firstWorkPlan.ShipNumber,
                    });
                }
            };
            //配置过程参数(采集参数、配方参数)
            traceModel.Params = new List<TraceParamModel>();
            foreach (var item in workSection.ProcessParameters)
            {
                string _value = "";
                //采集参数
                if (item.Name == $"{processName}压力")
                {
                    var _getValue = await _variableService.ReadValueAsync($"{processName}压力");
                    _value = _getValue.Content.Value.SafeString().ToString();
                }
                if (item.Name == $"{processName}位置")
                {
                    var _getValue = await _variableService.ReadValueAsync($"{processName}位置");
                    _value = _getValue.Content.Value.SafeString().ToString();
                }
                if (item.Name == $"{processName}速度")
                {
                    var _getValue = await _variableService.ReadValueAsync($"{processName}速度");
                    _value = _getValue.Content.Value.SafeString().ToString();
                }
                if (item.Name == $"{processName}间隙")
                {
                    _value = "15mm";
                }
                if (item.Name == $"{processName}人")
                {
                    _value = myCurrentUser.UserAccount;
                }
                //item.Key
                TraceParamModel traceParamModel = new TraceParamModel()
                {
                    Key = item.Key,
                    Value = _value
                };
                traceModel.Params.Add(traceParamModel);
            };
            foreach (var item in workSection.FormulaParameters)
            {
                string _value = "";
                //采集参数
                if (item.Name == $"{processName}压力")
                {
                    var _getValue = await _variableService.ReadValueAsync($"{processName}压力");
                    _value = _getValue.Content.Value.SafeString().ToString();
                }
                if (item.Name == $"{processName}位置")
                {
                    var _getValue = await _variableService.ReadValueAsync($"{processName}位置");
                    _value = _getValue.Content.Value.SafeString().ToString();
                }
                if (item.Name == $"{processName}速度")
                {
                    var _getValue = await _variableService.ReadValueAsync($"{processName}速度");
                    _value = _getValue.Content.Value.SafeString().ToString();
                }
                if (item.Name == $"{processName}间隙")
                {
                    _value = "15mm";
                }
                if (item.Name == $"{processName}人")
                {
                    _value = myCurrentUser.UserAccount;
                }
                //item.Key
                TraceParamModel traceParamModel = new TraceParamModel()
                {
                    Key = item.Key,
                    Value = _value
                };
                traceModel.Params.Add(traceParamModel);
            };
            traceModel.MaterialParams = _MaterialParams;
            await traceProvider.CreateTraceAsync(traceModel);
            var response = new MesOrderResponse
            {
                Code = "200",
                Data = "",
                Message = "处理成功",
                Time = DateTime.UtcNow
            };
            return response;
            #endregion
            await uow.CompleteAsync();
        }
        catch (Exception)
        {
            await uow.RollbackAsync();
            throw;
        }
        finally
        {
        }
        #endregion
    }
    /// <summary>
    /// å…¬å…±å¤„理 å“åº”出站完成信号
    /// </summary>
    /// <param name="_serviceProvider"></param>
    /// <param name="input"></param>
    /// <param name="myCurrentUser"></param>
    /// <returns></returns>
    public async Task CompleteHandleOutStoreFinish(IServiceProvider _serviceProvider, string processName, bool isOutResult)
    {
        VariableService _variableService = _serviceProvider.GetRequiredService<VariableService>();
        Dictionary<string, object?> keyValuePairs = new Dictionary<string, object?>
                    {
                        { $"{processName}出站完成",isOutResult},
                        { $"{processName}出站结果",isOutResult? "成功":""},
                    };
        await _variableService.WriteValueAsync(keyValuePairs);
    }
    /// <summary>
    /// ç”Ÿæˆéšæœºçš„WmsTaskNo
    /// </summary>
    /// <returns>随机生成的任务编号</returns>
PipeLineLems/server/src/CMS.Plugin.PipeLineLems/Controller/WorkPlanPublicController.cs
@@ -60,12 +60,23 @@
        [Route("Pick")]
        public virtual async Task<MesOrderResponse> Pick([FromBody] PickInput input)
        {
            MyCurrentUser myCurrentUser = new MyCurrentUser()
            try
            {
                UserAccount = _currentUser.UserAccount,
                UserId = _currentUser.UserId
            };
            return await sharedService.CommonPick(_serviceProvider, input, myCurrentUser);
                MyCurrentUser myCurrentUser = new MyCurrentUser()
                {
                    UserAccount = _currentUser.UserAccount,
                    UserId = _currentUser.UserId
                };
                return await sharedService.CommonPick(_serviceProvider, input, myCurrentUser);
            }
            catch (Exception ex)
            {
                return new MesOrderResponse()
                {
                    Code = "400",
                    Message = ex.Message
                };
            }
        }
@@ -79,14 +90,81 @@
        [Route("CallMaterial")]
        public virtual async Task<MesOrderResponse> CallMaterial([FromBody] CallMaterialByDataIdentifierInput input)
        {
            MyCurrentUser myCurrentUser = new MyCurrentUser()
            try
            {
                UserAccount = _currentUser.UserAccount,
                UserId = _currentUser.UserId
            };
            return await sharedService.CallMaterial(input, _serviceProvider, myCurrentUser);
                MyCurrentUser myCurrentUser = new MyCurrentUser()
                {
                    UserAccount = _currentUser.UserAccount,
                    UserId = _currentUser.UserId
                };
                return await sharedService.CallMaterial(input, _serviceProvider, myCurrentUser);
            }
            catch (Exception ex)
            {
                return new MesOrderResponse()
                {
                    Code = "400",
                    Message = ex.Message
                };
            }
        }
        /// <summary>
        /// å¼€å·¥
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [Authorize]
        [HttpPost]
        [Route("StartProduction")]
        public virtual async Task<MesOrderResponse> StartProduction([FromBody] StartProductionInput input)
        {
            try
            {
                MyCurrentUser myCurrentUser = new MyCurrentUser()
                {
                    UserAccount = _currentUser.UserAccount,
                    UserId = _currentUser.UserId
                };
                return await sharedService.StartProduction(input, _serviceProvider, myCurrentUser);
            }
            catch (Exception ex)
            {
                return new MesOrderResponse()
                {
                    Code = "400",
                    Message = ex.Message
                };
            }
        }
        /// <summary>
        /// å®Œå·¥
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [Authorize]
        [HttpPost]
        [Route("FinishProduction")]
        public virtual async Task<MesOrderResponse> FinishProduction([FromBody] CompleteAssemblyProcessInput input)
        {
            try
            {
                MyCurrentUser myCurrentUser = new MyCurrentUser()
                {
                    UserAccount = _currentUser.UserAccount,
                    UserId = _currentUser.UserId
                };
                return await sharedService.CompleteAssemblyProcess(_serviceProvider, input, myCurrentUser);
            }
            catch (Exception ex)
            {
                return new MesOrderResponse()
                {
                    Code = "400",
                    Message = ex.Message
                };
            }
        }
    }
}
PipeLineLems/server/src/CMS.Plugin.PipeLineLems/ProjectService/PipeLineLemsProjectService.cs
@@ -22,6 +22,8 @@
using System.Collections.Generic;
using CMS.Framework.AspNetCore.Users;
using NPOI.SS.Formula.Functions;
using CMS.Plugin.PipeLineLems.Application.Implements;
using CmsQueryExtensions.Entitys;
namespace CMS.Plugin.PipeLineLems.ProjectService
{
@@ -90,6 +92,8 @@
                { "请求生成打码产品码信号", "请求生成打码产品码信号(描述)" },
                { "请求生成切割产品码信号", "请求生成切割产品码信号(描述)" },
                { "切割进站信号", "切割进站信号(描述)" },
                { "装配完工信号", "装配完工信号(描述)" },
            };
            // åˆ›å»ºé€šé“监听
@@ -253,6 +257,25 @@
                        _ = Task.Run(async () =>
                        {
                            await HanlderForCutByCreateProductWhenFlaseAsync();
                        });
                    }
                }
                if (changed.Name == "装配完工信号")
                {
                    if (changed.New?.Value.SafeString().ToBool() == true)
                    {
                        _ = Task.Run(async () =>
                        {
                            await HanlderFor装配完工信号Async();
                        });
                    }
                    else
                    {
                        _ = Task.Run(async () =>
                        {
                            await HanlderFor完工信号WhenFalseAsync("装配");
                        });
                    }
                }
@@ -778,5 +801,67 @@
                    };
            var ret = _variableService.WriteValueAsync(keyValuePairs_productID);
        }
        /// <summary>
        /// è£…配完工信号=true时
        /// </summary>
        /// <returns></returns>
        private async Task HanlderFor装配完工信号Async()
        {
            var workPlanAppService = _serviceProvider.GetRequiredService<IWorkPlanAppService>();
            var workPlanRepository = _serviceProvider.GetRequiredService<IWorkPlanRepository>();
            var callMaterialOrderAppService = _serviceProvider.GetRequiredService<ICallMaterialOrderAppService>();
            var pipeSpecCode = await _variableService.ReadValueAsync("装配管段编码");
            if (string.IsNullOrEmpty(pipeSpecCode?.Content?.Value.SafeString().ToString()))
            {
            }
            else
            {
                var myPipeSpecCode = pipeSpecCode.Content.Value.SafeString().ToString();
                CallMaterialOrder callMaterialOrder = null;
                try
                {
                    var sharedService = _serviceProvider.GetRequiredService<SharedService>();
                    var userName = await _variableService.ReadValueAsync("装配人");
                    MyCurrentUser myCurrentUser = new MyCurrentUser()
                    {
                        UserAccount = userName.Content.Value.SafeString().ToString()
                    };
                    sharedService.CompleteAssemblyProcess(_serviceProvider, new Application.Contracts.Dtos.WorkPlan.CompleteAssemblyProcessInput() { PipeSpecCode = myPipeSpecCode, ProcessName="装配工序" }, myCurrentUser);
                }
                catch (Exception)
                {
                }
            }
        }
        /// <summary>
        /// å®Œå·¥ä¿¡å·=false时
        /// </summary>
        /// <returns></returns>
        private async Task HanlderFor完工信号WhenFalseAsync(string processName)
        {
            try
            {
                var sharedService = _serviceProvider.GetRequiredService<SharedService>();
                await sharedService.CompleteHandleOutStoreFinish(_serviceProvider, processName, false);
            }
            catch (Exception)
            {
            }
        }
    }
}