From 670fdc10eff2fa4b05cc64ac6c26893bd523a8e9 Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期五, 10 七月 2026 13:29:34 +0800
Subject: [PATCH] 工艺参数+工艺参数模板接口
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pd/processparamtemplate/MesPdProcessParamTemplateDO.java | 49 +
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparam/MesPdProcessParamController.java | 122 ++++
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparamtemplate/vo/MesPdProcessParamTemplatePageReqVO.java | 24
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/processparamtemplate/MesPdProcessParamTemplateDetailMapper.java | 20
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/processparam/MesPdProcessParamMapper.java | 25
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparam/vo/MesPdProcessParamPageReqVO.java | 24
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pd/processparam/MesPdProcessParamDO.java | 59 ++
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/processparamtemplate/MesPdProcessParamTemplateMapper.java | 25
docs/sql/mes_pd_process_param_init.sql | 119 ++++
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pd/processparamtemplate/MesPdProcessParamTemplateDetailDO.java | 69 ++
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparamtemplate/vo/MesPdProcessParamTemplateSaveReqVO.java | 50 +
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparamtemplate/vo/MesPdProcessParamTemplateRespVO.java | 83 ++
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparamtemplate/MesPdProcessParamTemplateController.java | 146 +++++
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/processparam/MesPdProcessParamService.java | 85 ++
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/processparam/MesPdProcessParamServiceImpl.java | 91 +++
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparam/vo/MesPdProcessParamRespVO.java | 54 +
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparam/vo/MesPdProcessParamSaveReqVO.java | 31 +
docs/process_param.md | 438 +++++++++++++++
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/processparamtemplate/MesPdProcessParamTemplateService.java | 73 ++
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/processparamtemplate/MesPdProcessParamTemplateServiceImpl.java | 146 +++++
20 files changed, 1,733 insertions(+), 0 deletions(-)
diff --git a/docs/process_param.md b/docs/process_param.md
new file mode 100644
index 0000000..d38f58e
--- /dev/null
+++ b/docs/process_param.md
@@ -0,0 +1,438 @@
+# 宸ヨ壓鍙傛暟涓庡伐鑹哄弬鏁版ā鏉�
+
+## 娑夊強椤甸潰
+
+- 宸ヨ壓鍙傛暟鍒楄〃椤碉紙鏂板锛�
+- 宸ヨ壓鍙傛暟妯℃澘鍒楄〃椤碉紙鏂板锛�
+
+## API
+
+### 宸ヨ壓鍙傛暟
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| POST | /mes/pd/process-param/create | 鍒涘缓宸ヨ壓鍙傛暟 |
+| PUT | /mes/pd/process-param/update | 鏇存柊宸ヨ壓鍙傛暟 |
+| DELETE | /mes/pd/process-param/delete?id= | 鍒犻櫎宸ヨ壓鍙傛暟 |
+| GET | /mes/pd/process-param/get?id= | 鑾峰彇宸ヨ壓鍙傛暟璇︽儏 |
+| GET | /mes/pd/process-param/page | 鍒嗛〉鏌ヨ宸ヨ壓鍙傛暟 |
+| GET | /mes/pd/process-param/export-excel | 瀵煎嚭宸ヨ壓鍙傛暟 |
+
+**鍒涘缓璇锋眰鍙傛暟锛�**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| paramName | String | 鏄� | 鍙傛暟鍚嶇О |
+| paramType | Integer | 鍚� | 鍙傛暟绫诲瀷锛堝瓧鍏� mes_pd_process_param_type锛�1=鏂囨湰 2=鏁板�� 3=甯冨皵 4=鏃ユ湡锛� |
+| unitMeasureId | Long | 鍚� | 璁¢噺鍗曚綅ID |
+| required | Boolean | 鍚� | 鏄惁蹇呭~锛岄粯璁alse |
+| remark | String | 鍚� | 澶囨敞 |
+
+娉ㄦ剰锛氬弬鏁扮紪鐮侊紙paramCode锛夌敱鍚庣鑷姩鐢熸垚锛屽墠绔棤闇�浼犲叆銆�
+
+**鍝嶅簲锛�**
+
+```json
+{ "code": 200, "data": 1, "msg": "鎿嶄綔鎴愬姛" }
+```
+
+**鍒嗛〉鏌ヨ鍙傛暟锛�**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| pageNo | Integer | 鏄� | 椤电爜 |
+| pageSize | Integer | 鏄� | 姣忛〉鏉℃暟 |
+| paramCode | String | 鍚� | 鍙傛暟缂栫爜锛堟ā绯婃悳绱級 |
+| paramName | String | 鍚� | 鍙傛暟鍚嶇О锛堟ā绯婃悳绱級 |
+| paramType | Integer | 鍚� | 鍙傛暟绫诲瀷锛堢簿纭尮閰嶏級 |
+
+**鍝嶅簲缁撴瀯锛�**
+
+```json
+{
+ "code": 200,
+ "data": {
+ "list": [
+ {
+ "id": 1,
+ "paramCode": "PP20240001",
+ "paramName": "娉ㄥ娓╁害",
+ "paramType": 2,
+ "unitMeasureId": 1,
+ "unitMeasureName": "鈩�",
+ "required": true,
+ "remark": "",
+ "createTime": "2024-01-01 00:00:00"
+ }
+ ],
+ "total": 1
+ }
+}
+```
+
+### 宸ヨ壓鍙傛暟妯℃澘
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| POST | /mes/pd/process-param-template/create | 鍒涘缓宸ヨ壓鍙傛暟妯℃澘 |
+| PUT | /mes/pd/process-param-template/update | 鏇存柊宸ヨ壓鍙傛暟妯℃澘 |
+| DELETE | /mes/pd/process-param-template/delete?id= | 鍒犻櫎宸ヨ壓鍙傛暟妯℃澘 |
+| GET | /mes/pd/process-param-template/get?id= | 鑾峰彇宸ヨ壓鍙傛暟妯℃澘璇︽儏 |
+| GET | /mes/pd/process-param-template/page | 鍒嗛〉鏌ヨ宸ヨ壓鍙傛暟妯℃澘 |
+| GET | /mes/pd/process-param-template/export-excel | 瀵煎嚭宸ヨ壓鍙傛暟妯℃澘 |
+
+**鍒涘缓/鏇存柊璇锋眰鍙傛暟锛�**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| id | Long | 鍚� | 缂栧彿锛堟洿鏂版椂蹇呭~锛� |
+| templateName | String | 鏄� | 妯℃澘鍚嶇О |
+| templateType | Integer | 鍚� | 妯℃澘绫诲瀷锛堝瓧鍏� mes_pd_process_param_template_type锛�1=閫氱敤 2=宸ュ簭 3=浜у搧锛� |
+| remark | String | 鍚� | 澶囨敞 |
+| details | List\<Detail\> | 鏄� | 妯℃澘鏄庣粏鍒楄〃 |
+
+**Detail 缁撴瀯锛�**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| processParamId | Long | 鏄� | 宸ヨ壓鍙傛暟ID |
+| required | Boolean | 鍚� | 鏄惁蹇呭~锛堝彲瑕嗙洊鍙傛暟榛樿鍊硷級 |
+| remark | String | 鍚� | 澶囨敞锛堝彲瑕嗙洊鍙傛暟榛樿鍊硷級 |
+
+娉ㄦ剰锛氭ā鏉跨紪鐮侊紙templateCode锛夌敱鍚庣鑷姩鐢熸垚锛屽墠绔棤闇�浼犲叆銆傛ā鏉挎槑缁嗛噰鐢ㄥ揩鐓ф満鍒垛�斺�斿叧鑱旀椂澶嶅埗鍙傛暟鍊硷紝鏀瑰彉宸ヨ壓鍙傛暟鍒楄〃鐨勫�间笉褰卞搷妯℃澘銆�
+
+**鍝嶅簲缁撴瀯锛�**
+
+```json
+{
+ "code": 200,
+ "data": {
+ "id": 1,
+ "templateCode": "PPT20240001",
+ "templateName": "娉ㄥ宸ヨ壓鍙傛暟妯℃澘",
+ "templateType": 2,
+ "remark": "",
+ "createTime": "2024-01-01 00:00:00",
+ "details": [
+ {
+ "id": 1,
+ "templateId": 1,
+ "processParamId": 1,
+ "paramCode": "PP20240001",
+ "paramName": "娉ㄥ娓╁害",
+ "paramType": 2,
+ "unitMeasureId": 1,
+ "unitMeasureName": "鈩�",
+ "required": true,
+ "remark": ""
+ }
+ ]
+ }
+}
+```
+
+## 鍓嶇淇敼鐐�
+
+### 1. 宸ヨ壓鍙傛暟鍒楄〃椤� - 鏂板椤甸潰
+
+鏂囦欢璺緞锛歚src/views/mes/pd/processparam/index.vue`
+
+```html
+<!-- 鎼滅储鏍� -->
+<el-form :model="queryParams" ref="queryFormRef" :inline="true">
+ <el-form-item label="鍙傛暟缂栫爜" prop="paramCode">
+ <el-input v-model="queryParams.paramCode" placeholder="璇疯緭鍏ュ弬鏁扮紪鐮�" clearable />
+ </el-form-item>
+ <el-form-item label="鍙傛暟鍚嶇О" prop="paramName">
+ <el-input v-model="queryParams.paramName" placeholder="璇疯緭鍏ュ弬鏁板悕绉�" clearable />
+ </el-form-item>
+ <el-form-item label="鍙傛暟绫诲瀷" prop="paramType">
+ <el-select v-model="queryParams.paramType" placeholder="璇烽�夋嫨鍙傛暟绫诲瀷" clearable>
+ <el-option v-for="dict in getIntDictOptions(DICT_TYPE.MES_PD_PROCESS_PARAM_TYPE)"
+ :key="dict.value" :label="dict.label" :value="dict.value" />
+ </el-select>
+ </el-form-item>
+ <el-form-item>
+ <el-button type="primary" @click="handleQuery"><Icon icon="ep:search" />鎼滅储</el-button>
+ <el-button @click="resetQuery"><Icon icon="ep:refresh" />閲嶇疆</el-button>
+ </el-form-item>
+</el-form>
+
+<!-- 鎿嶄綔鏍� -->
+<el-row :gutter="10" class="mb8">
+ <el-col :span="1.5">
+ <el-button type="primary" @click="openForm('create')"
+ v-hasPermi="['mes:pd-process-param:create']"><Icon icon="ep:plus" />鏂板</el-button>
+ </el-col>
+ <el-col :span="1.5">
+ <el-button type="warning" @click="handleExport"
+ v-hasPermi="['mes:pd-process-param:export']"><Icon icon="ep:download" />瀵煎嚭</el-button>
+ </el-col>
+</el-row>
+
+<!-- 鍒楄〃 -->
+<el-table v-loading="loading" :data="list">
+ <el-table-column label="缂栧彿" align="center" prop="id" />
+ <el-table-column label="鍙傛暟缂栫爜" align="center" prop="paramCode" />
+ <el-table-column label="鍙傛暟鍚嶇О" align="center" prop="paramName" />
+ <el-table-column label="鍙傛暟绫诲瀷" align="center" prop="paramType">
+ <template #default="scope">
+ <dict-tag :type="DICT_TYPE.MES_PD_PROCESS_PARAM_TYPE" :value="scope.row.paramType" />
+ </template>
+ </el-table-column>
+ <el-table-column label="鍗曚綅" align="center" prop="unitMeasureName" />
+ <el-table-column label="鏄惁蹇呭~" align="center" prop="required">
+ <template #default="scope">
+ <el-tag :type="scope.row.required ? 'danger' : 'info'">{{ scope.row.required ? '鏄�' : '鍚�' }}</el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="澶囨敞" align="center" prop="remark" show-overflow-tooltip />
+ <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180" />
+ <el-table-column label="鎿嶄綔" align="center" width="150">
+ <template #default="scope">
+ <el-button link type="primary" @click="openForm('update', scope.row.id)"
+ v-hasPermi="['mes:pd-process-param:update']">缂栬緫</el-button>
+ <el-button link type="danger" @click="handleDelete(scope.row.id)"
+ v-hasPermi="['mes:pd-process-param:delete']">鍒犻櫎</el-button>
+ </template>
+ </el-table-column>
+</el-table>
+```
+
+### 2. 宸ヨ壓鍙傛暟琛ㄥ崟寮圭獥 - 鏂板/缂栬緫
+
+鏂囦欢璺緞锛歚src/views/mes/pd/processparam/ProcessParamForm.vue`
+
+```html
+<el-dialog :title="dialogTitle" v-model="dialogVisible" width="500px">
+ <el-form ref="formRef" :model="formData" :rules="formRules" label-width="100px">
+ <el-form-item label="鍙傛暟鍚嶇О" prop="paramName">
+ <el-input v-model="formData.paramName" placeholder="璇疯緭鍏ュ弬鏁板悕绉�" />
+ </el-form-item>
+ <el-form-item label="鍙傛暟绫诲瀷" prop="paramType">
+ <el-select v-model="formData.paramType" placeholder="璇烽�夋嫨鍙傛暟绫诲瀷">
+ <el-option v-for="dict in getIntDictOptions(DICT_TYPE.MES_PD_PROCESS_PARAM_TYPE)"
+ :key="dict.value" :label="dict.label" :value="dict.value" />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="璁¢噺鍗曚綅" prop="unitMeasureId">
+ <el-select v-model="formData.unitMeasureId" placeholder="璇烽�夋嫨璁¢噺鍗曚綅" clearable filterable>
+ <!-- 浠庤閲忓崟浣嶆帴鍙h幏鍙栧垪琛� -->
+ </el-select>
+ </el-form-item>
+ <el-form-item label="鏄惁蹇呭~" prop="required">
+ <el-switch v-model="formData.required" />
+ </el-form-item>
+ <el-form-item label="澶囨敞" prop="remark">
+ <el-input v-model="formData.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�" />
+ </el-form-item>
+ </el-form>
+</el-dialog>
+```
+
+### 3. data 鏁版嵁
+
+```js
+const queryParams = reactive({
+ pageNo: 1,
+ pageSize: 10,
+ paramCode: undefined,
+ paramName: undefined,
+ paramType: undefined,
+})
+const formData = reactive({
+ id: undefined,
+ paramName: undefined,
+ paramType: undefined,
+ unitMeasureId: undefined,
+ required: false,
+ remark: undefined,
+})
+```
+
+### 4. 宸ヨ壓鍙傛暟妯℃澘鍒楄〃椤� - 鏂板椤甸潰
+
+鏂囦欢璺緞锛歚src/views/mes/pd/processparamtemplate/index.vue`
+
+```html
+<!-- 鎼滅储鏍� -->
+<el-form :model="queryParams" ref="queryFormRef" :inline="true">
+ <el-form-item label="妯℃澘缂栫爜" prop="templateCode">
+ <el-input v-model="queryParams.templateCode" placeholder="璇疯緭鍏ユā鏉跨紪鐮�" clearable />
+ </el-form-item>
+ <el-form-item label="妯℃澘鍚嶇О" prop="templateName">
+ <el-input v-model="queryParams.templateName" placeholder="璇疯緭鍏ユā鏉垮悕绉�" clearable />
+ </el-form-item>
+ <el-form-item label="妯℃澘绫诲瀷" prop="templateType">
+ <el-select v-model="queryParams.templateType" placeholder="璇烽�夋嫨妯℃澘绫诲瀷" clearable>
+ <el-option v-for="dict in getIntDictOptions(DICT_TYPE.MES_PD_PROCESS_PARAM_TEMPLATE_TYPE)"
+ :key="dict.value" :label="dict.label" :value="dict.value" />
+ </el-select>
+ </el-form-item>
+ <el-form-item>
+ <el-button type="primary" @click="handleQuery"><Icon icon="ep:search" />鎼滅储</el-button>
+ <el-button @click="resetQuery"><Icon icon="ep:refresh" />閲嶇疆</el-button>
+ </el-form-item>
+</el-form>
+
+<!-- 鍒楄〃 -->
+<el-table v-loading="loading" :data="list">
+ <el-table-column label="缂栧彿" align="center" prop="id" />
+ <el-table-column label="妯℃澘缂栫爜" align="center" prop="templateCode" />
+ <el-table-column label="妯℃澘鍚嶇О" align="center" prop="templateName" />
+ <el-table-column label="妯℃澘绫诲瀷" align="center" prop="templateType">
+ <template #default="scope">
+ <dict-tag :type="DICT_TYPE.MES_PD_PROCESS_PARAM_TEMPLATE_TYPE" :value="scope.row.templateType" />
+ </template>
+ </el-table-column>
+ <el-table-column label="澶囨敞" align="center" prop="remark" show-overflow-tooltip />
+ <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180" />
+ <el-table-column label="鎿嶄綔" align="center" width="150">
+ <template #default="scope">
+ <el-button link type="primary" @click="openForm('update', scope.row.id)"
+ v-hasPermi="['mes:pd-process-param-template:update']">缂栬緫</el-button>
+ <el-button link type="danger" @click="handleDelete(scope.row.id)"
+ v-hasPermi="['mes:pd-process-param-template:delete']">鍒犻櫎</el-button>
+ </template>
+ </el-table-column>
+</el-table>
+```
+
+### 5. 宸ヨ壓鍙傛暟妯℃澘琛ㄥ崟寮圭獥锛堝惈鏄庣粏锛�
+
+鏂囦欢璺緞锛歚src/views/mes/pd/processparamtemplate/ProcessParamTemplateForm.vue`
+
+```html
+<el-dialog :title="dialogTitle" v-model="dialogVisible" width="800px">
+ <el-form ref="formRef" :model="formData" :rules="formRules" label-width="100px">
+ <el-form-item label="妯℃澘鍚嶇О" prop="templateName">
+ <el-input v-model="formData.templateName" placeholder="璇疯緭鍏ユā鏉垮悕绉�" />
+ </el-form-item>
+ <el-form-item label="妯℃澘绫诲瀷" prop="templateType">
+ <el-select v-model="formData.templateType" placeholder="璇烽�夋嫨妯℃澘绫诲瀷">
+ <el-option v-for="dict in getIntDictOptions(DICT_TYPE.MES_PD_PROCESS_PARAM_TEMPLATE_TYPE)"
+ :key="dict.value" :label="dict.label" :value="dict.value" />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="澶囨敞" prop="remark">
+ <el-input v-model="formData.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�" />
+ </el-form-item>
+
+ <!-- 妯℃澘鏄庣粏鍒楄〃 -->
+ <el-form-item label="宸ヨ壓鍙傛暟" prop="details">
+ <el-button type="primary" size="small" @click="addDetail"><Icon icon="ep:plus" />娣诲姞鍙傛暟</el-button>
+ <el-table :data="formData.details" border style="width: 100%; margin-top: 10px">
+ <el-table-column label="宸ヨ壓鍙傛暟" align="center" min-width="200">
+ <template #default="scope">
+ <el-select v-model="scope.row.processParamId" placeholder="璇烽�夋嫨宸ヨ壓鍙傛暟" filterable
+ @change="onParamChange(scope.row)">
+ <!-- 浠庡伐鑹哄弬鏁板垪琛ㄦ帴鍙h幏鍙� -->
+ </el-select>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍙傛暟缂栫爜" align="center" prop="paramCode" width="120" />
+ <el-table-column label="鍙傛暟绫诲瀷" align="center" prop="paramTypeName" width="100" />
+ <el-table-column label="鍗曚綅" align="center" prop="unitMeasureName" width="80" />
+ <el-table-column label="鏄惁蹇呭~" align="center" width="100">
+ <template #default="scope">
+ <el-switch v-model="scope.row.required" />
+ </template>
+ </el-table-column>
+ <el-table-column label="澶囨敞" align="center" min-width="120">
+ <template #default="scope">
+ <el-input v-model="scope.row.remark" placeholder="澶囨敞" />
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" align="center" width="60">
+ <template #default="scope">
+ <el-button link type="danger" @click="removeDetail(scope.$index)">鍒犻櫎</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+ </el-form-item>
+ </el-form>
+</el-dialog>
+```
+
+### 6. API 鎺ュ彛瀹氫箟
+
+鏂囦欢璺緞锛歚src/api/mes/pd/processparam/index.ts`
+
+```ts
+import request from '@/config/axios'
+
+// 鍒涘缓宸ヨ壓鍙傛暟
+export const createProcessParam = (data) => {
+ return request.post({ url: '/mes/pd/process-param/create', data })
+}
+
+// 鏇存柊宸ヨ壓鍙傛暟
+export const updateProcessParam = (data) => {
+ return request.put({ url: '/mes/pd/process-param/update', data })
+}
+
+// 鍒犻櫎宸ヨ壓鍙傛暟
+export const deleteProcessParam = (id: number) => {
+ return request.delete({ url: '/mes/pd/process-param/delete?id=' + id })
+}
+
+// 鑾峰彇宸ヨ壓鍙傛暟
+export const getProcessParam = (id: number) => {
+ return request.get({ url: '/mes/pd/process-param/get?id=' + id })
+}
+
+// 鑾峰彇宸ヨ壓鍙傛暟鍒嗛〉
+export const getProcessParamPage = (params) => {
+ return request.get({ url: '/mes/pd/process-param/page', params })
+}
+
+// 瀵煎嚭宸ヨ壓鍙傛暟 Excel
+export const exportProcessParamExcel = (params) => {
+ return request.download({ url: '/mes/pd/process-param/export-excel', params })
+}
+```
+
+鏂囦欢璺緞锛歚src/api/mes/pd/processparamtemplate/index.ts`
+
+```ts
+import request from '@/config/axios'
+
+// 鍒涘缓宸ヨ壓鍙傛暟妯℃澘
+export const createProcessParamTemplate = (data) => {
+ return request.post({ url: '/mes/pd/process-param-template/create', data })
+}
+
+// 鏇存柊宸ヨ壓鍙傛暟妯℃澘
+export const updateProcessParamTemplate = (data) => {
+ return request.put({ url: '/mes/pd/process-param-template/update', data })
+}
+
+// 鍒犻櫎宸ヨ壓鍙傛暟妯℃澘
+export const deleteProcessParamTemplate = (id: number) => {
+ return request.delete({ url: '/mes/pd/process-param-template/delete?id=' + id })
+}
+
+// 鑾峰彇宸ヨ壓鍙傛暟妯℃澘
+export const getProcessParamTemplate = (id: number) => {
+ return request.get({ url: '/mes/pd/process-param-template/get?id=' + id })
+}
+
+// 鑾峰彇宸ヨ壓鍙傛暟妯℃澘鍒嗛〉
+export const getProcessParamTemplatePage = (params) => {
+ return request.get({ url: '/mes/pd/process-param-template/page', params })
+}
+
+// 瀵煎嚭宸ヨ壓鍙傛暟妯℃澘 Excel
+export const exportProcessParamTemplateExcel = (params) => {
+ return request.download({ url: '/mes/pd/process-param-template/export-excel', params })
+}
+```
+
+## 娉ㄦ剰浜嬮」
+
+- **蹇収鏈哄埗**锛氭ā鏉垮叧鑱斿伐鑹哄弬鏁版椂锛屽悗绔細澶嶅埗鍙傛暟鐨勫綋鍓嶅�煎埌妯℃澘鏄庣粏涓�備箣鍚庝慨鏀瑰伐鑹哄弬鏁扮殑鍚嶇О銆佺被鍨嬨�佸崟浣嶇瓑锛屼笉浼氬奖鍝嶅凡鍏宠仈鐨勬ā鏉裤�傝繖鏄璁′笂瑕佹眰鐨�"鏀瑰彉宸ヨ壓鍙傛暟鍒楄〃鐨勫�间笉鑳藉奖鍝嶆ā鏉跨殑鍙樺寲"銆�
+- **鍙傛暟缂栫爜鍜屾ā鏉跨紪鐮�**鐢卞悗绔嚜鍔ㄧ敓鎴愶紝鍓嶇鍒涘缓鏃朵笉闇�瑕佷紶鍏ャ��
+- 宸ヨ壓鍙傛暟绫诲瀷瀛楀吀锛歚mes_pd_process_param_type`锛�1=鏂囨湰銆�2=鏁板�笺��3=甯冨皵銆�4=鏃ユ湡锛�
+- 宸ヨ壓鍙傛暟妯℃澘绫诲瀷瀛楀吀锛歚mes_pd_process_param_template_type`锛�1=閫氱敤銆�2=宸ュ簭銆�3=浜у搧锛�
+- 璁¢噺鍗曚綅涓嬫媺妗嗛渶瑕佽皟鐢� MDM 妯″潡鐨勮閲忓崟浣嶅垪琛ㄦ帴鍙h幏鍙栨暟鎹�
+- 妯℃澘琛ㄥ崟涓殑鏄庣粏琛岋紝閫夋嫨宸ヨ壓鍙傛暟鍚庝細鑷姩甯﹀嚭鍙傛暟缂栫爜銆佸悕绉般�佺被鍨嬨�佸崟浣嶇瓑淇℃伅
diff --git a/docs/sql/mes_pd_process_param_init.sql b/docs/sql/mes_pd_process_param_init.sql
new file mode 100644
index 0000000..28cf518
--- /dev/null
+++ b/docs/sql/mes_pd_process_param_init.sql
@@ -0,0 +1,119 @@
+-- =============================================
+-- MES 宸ヨ壓鍙傛暟涓庡伐鑹哄弬鏁版ā鏉� - 鍒濆鍖栬剼鏈�
+-- =============================================
+
+-- ----------------------------
+-- 宸ヨ壓鍙傛暟
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `mes_pd_process_param` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '缂栧彿',
+ `param_code` varchar(64) DEFAULT NULL COMMENT '鍙傛暟缂栫爜',
+ `param_name` varchar(255) NOT NULL COMMENT '鍙傛暟鍚嶇О',
+ `param_type` tinyint DEFAULT NULL COMMENT '鍙傛暟绫诲瀷锛堝瓧鍏� mes_pd_process_param_type锛�',
+ `unit_measure_id` bigint DEFAULT NULL COMMENT '璁¢噺鍗曚綅ID锛堝叧鑱� mes_md_unit_measure锛�',
+ `required` bit(1) NOT NULL DEFAULT b'0' COMMENT '鏄惁蹇呭~',
+ `remark` varchar(500) DEFAULT NULL COMMENT '澶囨敞',
+ `creator` varchar(64) DEFAULT '' COMMENT '鍒涘缓鑰�',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
+ `updater` varchar(64) DEFAULT '' COMMENT '鏇存柊鑰�',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '鏄惁鍒犻櫎',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '绉熸埛缂栧彿',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB COMMENT='MES 宸ヨ壓鍙傛暟';
+
+-- ----------------------------
+-- 宸ヨ壓鍙傛暟妯℃澘
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `mes_pd_process_param_template` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '缂栧彿',
+ `template_code` varchar(64) DEFAULT NULL COMMENT '妯℃澘缂栫爜',
+ `template_name` varchar(255) NOT NULL COMMENT '妯℃澘鍚嶇О',
+ `template_type` tinyint DEFAULT NULL COMMENT '妯℃澘绫诲瀷锛堝瓧鍏� mes_pd_process_param_template_type锛�',
+ `remark` varchar(500) DEFAULT NULL COMMENT '澶囨敞',
+ `creator` varchar(64) DEFAULT '' COMMENT '鍒涘缓鑰�',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
+ `updater` varchar(64) DEFAULT '' COMMENT '鏇存柊鑰�',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '鏄惁鍒犻櫎',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '绉熸埛缂栧彿',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB COMMENT='MES 宸ヨ壓鍙傛暟妯℃澘';
+
+-- ----------------------------
+-- 宸ヨ壓鍙傛暟妯℃澘鏄庣粏锛堝揩鐓ц〃锛�
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `mes_pd_process_param_template_detail` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '缂栧彿',
+ `template_id` bigint NOT NULL COMMENT '妯℃澘ID锛堝叧鑱� mes_pd_process_param_template锛�',
+ `process_param_id` bigint DEFAULT NULL COMMENT '宸ヨ壓鍙傛暟ID锛堜粎浣滄函婧愶紝涓嶅奖鍝嶅揩鐓у�硷級',
+ `param_code` varchar(64) DEFAULT NULL COMMENT '鍙傛暟缂栫爜锛堝揩鐓э級',
+ `param_name` varchar(255) DEFAULT NULL COMMENT '鍙傛暟鍚嶇О锛堝揩鐓э級',
+ `param_type` tinyint DEFAULT NULL COMMENT '鍙傛暟绫诲瀷锛堝揩鐓э級',
+ `unit_measure_id` bigint DEFAULT NULL COMMENT '璁¢噺鍗曚綅ID锛堝揩鐓э級',
+ `required` bit(1) NOT NULL DEFAULT b'0' COMMENT '鏄惁蹇呭~锛堝揩鐓э級',
+ `remark` varchar(500) DEFAULT NULL COMMENT '澶囨敞锛堝揩鐓э級',
+ `creator` varchar(64) DEFAULT '' COMMENT '鍒涘缓鑰�',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
+ `updater` varchar(64) DEFAULT '' COMMENT '鏇存柊鑰�',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '鏄惁鍒犻櫎',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '绉熸埛缂栧彿',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB COMMENT='MES 宸ヨ壓鍙傛暟妯℃澘鏄庣粏';
+
+-- ----------------------------
+-- 瀛楀吀绫诲瀷
+-- ----------------------------
+INSERT INTO `system_dict_type` (`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
+('宸ヨ壓鍙傛暟绫诲瀷', 'mes_pd_process_param_type', 0, '宸ヨ壓鍙傛暟绫诲瀷', '1', NOW(), '1', NOW(), b'0'),
+('宸ヨ壓鍙傛暟妯℃澘绫诲瀷', 'mes_pd_process_param_template_type', 0, '宸ヨ壓鍙傛暟妯℃澘绫诲瀷', '1', NOW(), '1', NOW(), b'0');
+
+-- ----------------------------
+-- 瀛楀吀鏁版嵁 - 宸ヨ壓鍙傛暟绫诲瀷
+-- ----------------------------
+INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
+(0, '鏂囨湰', '1', 'mes_pd_process_param_type', 0, 'default', '', '', '1', NOW(), '1', NOW(), b'0'),
+(1, '鏁板��', '2', 'mes_pd_process_param_type', 0, 'primary', '', '', '1', NOW(), '1', NOW(), b'0'),
+(2, '甯冨皵', '3', 'mes_pd_process_param_type', 0, 'success', '', '', '1', NOW(), '1', NOW(), b'0'),
+(3, '鏃ユ湡', '4', 'mes_pd_process_param_type', 0, 'warning', '', '', '1', NOW(), '1', NOW(), b'0');
+
+-- ----------------------------
+-- 瀛楀吀鏁版嵁 - 宸ヨ壓鍙傛暟妯℃澘绫诲瀷
+-- ----------------------------
+INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
+(0, '閫氱敤', '1', 'mes_pd_process_param_template_type', 0, 'default', '', '', '1', NOW(), '1', NOW(), b'0'),
+(1, '宸ュ簭', '2', 'mes_pd_process_param_template_type', 0, 'primary', '', '', '1', NOW(), '1', NOW(), b'0'),
+(2, '浜у搧', '3', 'mes_pd_process_param_template_type', 0, 'success', '', '', '1', NOW(), '1', NOW(), b'0');
+
+-- ----------------------------
+-- 鑿滃崟 - 宸ヨ壓鍙傛暟锛堜簩绾ц彍鍗曪紝鎸傚湪浜у搧璁捐涓嬶級
+-- 娉ㄦ剰锛歱arent_id 浣跨敤鍙橀噺 @pd_menu_id锛岄渶涓� mes_pd_init.sql 涓殑浜у搧璁捐涓�绾ц彍鍗曢厤鍚�
+-- 濡傛灉浜у搧璁捐鑿滃崟宸插瓨鍦紝璇峰厛璁剧疆 @pd_menu_id 涓哄疄闄呯殑鑿滃崟ID
+-- ----------------------------
+
+-- 浜岀骇鑿滃崟锛氬伐鑹哄弬鏁�
+INSERT INTO `system_menu` (`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
+('宸ヨ壓鍙傛暟', '', 2, 3, @pd_menu_id, 'process-param', '', 'mes/pd/processparam/index', 0, '1', NOW(), '1', NOW(), b'0');
+SET @process_param_menu_id = LAST_INSERT_ID();
+
+-- 宸ヨ壓鍙傛暟鎸夐挳鏉冮檺
+INSERT INTO `system_menu` (`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
+('宸ヨ壓鍙傛暟鏌ヨ', 'mes:pd-process-param:query', 3, 1, @process_param_menu_id, '', '', '', 0, '1', NOW(), '1', NOW(), b'0'),
+('宸ヨ壓鍙傛暟鍒涘缓', 'mes:pd-process-param:create', 3, 2, @process_param_menu_id, '', '', '', 0, '1', NOW(), '1', NOW(), b'0'),
+('宸ヨ壓鍙傛暟鏇存柊', 'mes:pd-process-param:update', 3, 3, @process_param_menu_id, '', '', '', 0, '1', NOW(), '1', NOW(), b'0'),
+('宸ヨ壓鍙傛暟鍒犻櫎', 'mes:pd-process-param:delete', 3, 4, @process_param_menu_id, '', '', '', 0, '1', NOW(), '1', NOW(), b'0'),
+('宸ヨ壓鍙傛暟瀵煎嚭', 'mes:pd-process-param:export', 3, 5, @process_param_menu_id, '', '', '', 0, '1', NOW(), '1', NOW(), b'0');
+
+-- 浜岀骇鑿滃崟锛氬伐鑹哄弬鏁版ā鏉�
+INSERT INTO `system_menu` (`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
+('宸ヨ壓鍙傛暟妯℃澘', '', 2, 4, @pd_menu_id, 'process-param-template', '', 'mes/pd/processparamtemplate/index', 0, '1', NOW(), '1', NOW(), b'0');
+SET @template_menu_id = LAST_INSERT_ID();
+
+-- 宸ヨ壓鍙傛暟妯℃澘鎸夐挳鏉冮檺
+INSERT INTO `system_menu` (`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
+('宸ヨ壓鍙傛暟妯℃澘鏌ヨ', 'mes:pd-process-param-template:query', 3, 1, @template_menu_id, '', '', '', 0, '1', NOW(), '1', NOW(), b'0'),
+('宸ヨ壓鍙傛暟妯℃澘鍒涘缓', 'mes:pd-process-param-template:create', 3, 2, @template_menu_id, '', '', '', 0, '1', NOW(), '1', NOW(), b'0'),
+('宸ヨ壓鍙傛暟妯℃澘鏇存柊', 'mes:pd-process-param-template:update', 3, 3, @template_menu_id, '', '', '', 0, '1', NOW(), '1', NOW(), b'0'),
+('宸ヨ壓鍙傛暟妯℃澘鍒犻櫎', 'mes:pd-process-param-template:delete', 3, 4, @template_menu_id, '', '', '', 0, '1', NOW(), '1', NOW(), b'0'),
+('宸ヨ壓鍙傛暟妯℃澘瀵煎嚭', 'mes:pd-process-param-template:export', 3, 5, @template_menu_id, '', '', '', 0, '1', NOW(), '1', NOW(), b'0');
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparam/MesPdProcessParamController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparam/MesPdProcessParamController.java
new file mode 100644
index 0000000..cd9770b
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparam/MesPdProcessParamController.java
@@ -0,0 +1,122 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pd.processparam;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.mes.controller.admin.pd.processparam.vo.MesPdProcessParamPageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pd.processparam.vo.MesPdProcessParamRespVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pd.processparam.vo.MesPdProcessParamSaveReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparam.MesPdProcessParamDO;
+import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mes.service.pd.processparam.MesPdProcessParamService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
+
+@Tag(name = "绠$悊鍚庡彴 - MES 宸ヨ壓鍙傛暟")
+@RestController
+@RequestMapping("/mes/pd/process-param")
+@Validated
+public class MesPdProcessParamController {
+
+ @Resource
+ private MesPdProcessParamService processParamService;
+
+ @Resource
+ private MesMdUnitMeasureService unitMeasureService;
+
+ @PostMapping("/create")
+ @Operation(summary = "鍒涘缓宸ヨ壓鍙傛暟")
+ @PreAuthorize("@ss.hasPermission('mes:pd-process-param:create')")
+ public CommonResult<Long> createProcessParam(@Valid @RequestBody MesPdProcessParamSaveReqVO createReqVO) {
+ return success(processParamService.createProcessParam(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "鏇存柊宸ヨ壓鍙傛暟")
+ @PreAuthorize("@ss.hasPermission('mes:pd-process-param:update')")
+ public CommonResult<Boolean> updateProcessParam(@Valid @RequestBody MesPdProcessParamSaveReqVO updateReqVO) {
+ processParamService.updateProcessParam(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "鍒犻櫎宸ヨ壓鍙傛暟")
+ @Parameter(name = "id", description = "缂栧彿", required = true)
+ @PreAuthorize("@ss.hasPermission('mes:pd-process-param:delete')")
+ public CommonResult<Boolean> deleteProcessParam(@RequestParam("id") Long id) {
+ processParamService.deleteProcessParam(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "鑾峰緱宸ヨ壓鍙傛暟")
+ @Parameter(name = "id", description = "缂栧彿", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('mes:pd-process-param:query')")
+ public CommonResult<MesPdProcessParamRespVO> getProcessParam(@RequestParam("id") Long id) {
+ MesPdProcessParamDO processParam = processParamService.getProcessParam(id);
+ if (processParam == null) {
+ return success(null);
+ }
+ return success(buildProcessParamRespVOList(Collections.singletonList(processParam)).get(0));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "鑾峰緱宸ヨ壓鍙傛暟鍒嗛〉")
+ @PreAuthorize("@ss.hasPermission('mes:pd-process-param:query')")
+ public CommonResult<PageResult<MesPdProcessParamRespVO>> getProcessParamPage(@Valid MesPdProcessParamPageReqVO pageReqVO) {
+ PageResult<MesPdProcessParamDO> pageResult = processParamService.getProcessParamPage(pageReqVO);
+ return success(new PageResult<>(buildProcessParamRespVOList(pageResult.getList()), pageResult.getTotal()));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "瀵煎嚭宸ヨ壓鍙傛暟 Excel")
+ @PreAuthorize("@ss.hasPermission('mes:pd-process-param:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportProcessParamExcel(@Valid MesPdProcessParamPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List<MesPdProcessParamDO> list = processParamService.getProcessParamPage(pageReqVO).getList();
+ // 瀵煎嚭 Excel
+ ExcelUtils.write(response, "宸ヨ壓鍙傛暟.xls", "鏁版嵁", MesPdProcessParamRespVO.class,
+ buildProcessParamRespVOList(list));
+ }
+
+ // ==================== 鎷兼帴 VO ====================
+
+ private List<MesPdProcessParamRespVO> buildProcessParamRespVOList(List<MesPdProcessParamDO> list) {
+ if (CollUtil.isEmpty(list)) {
+ return Collections.emptyList();
+ }
+ // 1. 鎵归噺鑾峰彇鍏宠仈鏁版嵁锛堣閲忓崟浣嶏級
+ Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
+ convertSet(list, MesPdProcessParamDO::getUnitMeasureId));
+ // 2. 鎷兼帴 VO
+ return BeanUtils.toBean(list, MesPdProcessParamRespVO.class, vo ->
+ MapUtils.findAndThen(unitMeasureMap, vo.getUnitMeasureId(),
+ unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName()))
+ );
+ }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparam/vo/MesPdProcessParamPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparam/vo/MesPdProcessParamPageReqVO.java
new file mode 100644
index 0000000..2402445
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparam/vo/MesPdProcessParamPageReqVO.java
@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pd.processparam.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 宸ヨ壓鍙傛暟鍒嗛〉 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class MesPdProcessParamPageReqVO extends PageParam {
+
+ @Schema(description = "鍙傛暟缂栫爜", example = "PP2024001")
+ private String paramCode;
+
+ @Schema(description = "鍙傛暟鍚嶇О", example = "娓╁害")
+ private String paramName;
+
+ @Schema(description = "鍙傛暟绫诲瀷", example = "1")
+ private Integer paramType;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparam/vo/MesPdProcessParamRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparam/vo/MesPdProcessParamRespVO.java
new file mode 100644
index 0000000..d56d687
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparam/vo/MesPdProcessParamRespVO.java
@@ -0,0 +1,54 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pd.processparam.vo;
+
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+import cn.iocoder.yudao.module.mes.enums.DictTypeConstants;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 宸ヨ壓鍙傛暟 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class MesPdProcessParamRespVO {
+
+ @Schema(description = "缂栧彿", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+ @ExcelProperty("缂栧彿")
+ private Long id;
+
+ @Schema(description = "鍙傛暟缂栫爜", requiredMode = Schema.RequiredMode.REQUIRED, example = "PP2024001")
+ @ExcelProperty("鍙傛暟缂栫爜")
+ private String paramCode;
+
+ @Schema(description = "鍙傛暟鍚嶇О", requiredMode = Schema.RequiredMode.REQUIRED, example = "娓╁害")
+ @ExcelProperty("鍙傛暟鍚嶇О")
+ private String paramName;
+
+ @Schema(description = "鍙傛暟绫诲瀷", example = "1")
+ @ExcelProperty(value = "鍙傛暟绫诲瀷", converter = DictConvert.class)
+ @DictFormat(DictTypeConstants.MES_PD_PROCESS_PARAM_TYPE)
+ private Integer paramType;
+
+ @Schema(description = "璁¢噺鍗曚綅ID", example = "1")
+ private Long unitMeasureId;
+
+ @Schema(description = "璁¢噺鍗曚綅鍚嶇О", example = "鈩�")
+ @ExcelProperty("鍗曚綅")
+ private String unitMeasureName;
+
+ @Schema(description = "鏄惁蹇呭~", example = "true")
+ @ExcelProperty("鏄惁蹇呭~")
+ private Boolean required;
+
+ @Schema(description = "澶囨敞", example = "娴嬭瘯澶囨敞")
+ @ExcelProperty("澶囨敞")
+ private String remark;
+
+ @Schema(description = "鍒涘缓鏃堕棿", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("鍒涘缓鏃堕棿")
+ private LocalDateTime createTime;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparam/vo/MesPdProcessParamSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparam/vo/MesPdProcessParamSaveReqVO.java
new file mode 100644
index 0000000..a66bc46
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparam/vo/MesPdProcessParamSaveReqVO.java
@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pd.processparam.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import jakarta.validation.constraints.NotBlank;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 宸ヨ壓鍙傛暟鏂板/淇敼 Request VO")
+@Data
+public class MesPdProcessParamSaveReqVO {
+
+ @Schema(description = "缂栧彿", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "1024")
+ private Long id;
+
+ @Schema(description = "鍙傛暟鍚嶇О", requiredMode = Schema.RequiredMode.REQUIRED, example = "娓╁害")
+ @NotBlank(message = "鍙傛暟鍚嶇О涓嶈兘涓虹┖")
+ private String paramName;
+
+ @Schema(description = "鍙傛暟绫诲瀷", example = "1")
+ private Integer paramType;
+
+ @Schema(description = "璁¢噺鍗曚綅ID", example = "1")
+ private Long unitMeasureId;
+
+ @Schema(description = "鏄惁蹇呭~", example = "true")
+ private Boolean required;
+
+ @Schema(description = "澶囨敞", example = "娴嬭瘯澶囨敞")
+ private String remark;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparamtemplate/MesPdProcessParamTemplateController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparamtemplate/MesPdProcessParamTemplateController.java
new file mode 100644
index 0000000..a4e9a44
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparamtemplate/MesPdProcessParamTemplateController.java
@@ -0,0 +1,146 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pd.processparamtemplate;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.mes.controller.admin.pd.processparamtemplate.vo.MesPdProcessParamTemplatePageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pd.processparamtemplate.vo.MesPdProcessParamTemplateRespVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pd.processparamtemplate.vo.MesPdProcessParamTemplateSaveReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparamtemplate.MesPdProcessParamTemplateDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparamtemplate.MesPdProcessParamTemplateDetailDO;
+import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mes.service.pd.processparamtemplate.MesPdProcessParamTemplateService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
+
+@Tag(name = "绠$悊鍚庡彴 - MES 宸ヨ壓鍙傛暟妯℃澘")
+@RestController
+@RequestMapping("/mes/pd/process-param-template")
+@Validated
+public class MesPdProcessParamTemplateController {
+
+ @Resource
+ private MesPdProcessParamTemplateService templateService;
+
+ @Resource
+ private MesMdUnitMeasureService unitMeasureService;
+
+ @PostMapping("/create")
+ @Operation(summary = "鍒涘缓宸ヨ壓鍙傛暟妯℃澘")
+ @PreAuthorize("@ss.hasPermission('mes:pd-process-param-template:create')")
+ public CommonResult<Long> createProcessParamTemplate(@Valid @RequestBody MesPdProcessParamTemplateSaveReqVO createReqVO) {
+ return success(templateService.createProcessParamTemplate(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "鏇存柊宸ヨ壓鍙傛暟妯℃澘")
+ @PreAuthorize("@ss.hasPermission('mes:pd-process-param-template:update')")
+ public CommonResult<Boolean> updateProcessParamTemplate(@Valid @RequestBody MesPdProcessParamTemplateSaveReqVO updateReqVO) {
+ templateService.updateProcessParamTemplate(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "鍒犻櫎宸ヨ壓鍙傛暟妯℃澘")
+ @Parameter(name = "id", description = "缂栧彿", required = true)
+ @PreAuthorize("@ss.hasPermission('mes:pd-process-param-template:delete')")
+ public CommonResult<Boolean> deleteProcessParamTemplate(@RequestParam("id") Long id) {
+ templateService.deleteProcessParamTemplate(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "鑾峰緱宸ヨ壓鍙傛暟妯℃澘")
+ @Parameter(name = "id", description = "缂栧彿", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('mes:pd-process-param-template:query')")
+ public CommonResult<MesPdProcessParamTemplateRespVO> getProcessParamTemplate(@RequestParam("id") Long id) {
+ MesPdProcessParamTemplateDO template = templateService.getProcessParamTemplate(id);
+ if (template == null) {
+ return success(null);
+ }
+ return success(buildTemplateRespVO(template));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "鑾峰緱宸ヨ壓鍙傛暟妯℃澘鍒嗛〉")
+ @PreAuthorize("@ss.hasPermission('mes:pd-process-param-template:query')")
+ public CommonResult<PageResult<MesPdProcessParamTemplateRespVO>> getProcessParamTemplatePage(@Valid MesPdProcessParamTemplatePageReqVO pageReqVO) {
+ PageResult<MesPdProcessParamTemplateDO> pageResult = templateService.getProcessParamTemplatePage(pageReqVO);
+ List<MesPdProcessParamTemplateRespVO> voList = buildTemplateRespVOList(pageResult.getList());
+ return success(new PageResult<>(voList, pageResult.getTotal()));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "瀵煎嚭宸ヨ壓鍙傛暟妯℃澘 Excel")
+ @PreAuthorize("@ss.hasPermission('mes:pd-process-param-template:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportProcessParamTemplateExcel(@Valid MesPdProcessParamTemplatePageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List<MesPdProcessParamTemplateDO> list = templateService.getProcessParamTemplatePage(pageReqVO).getList();
+ // 瀵煎嚭 Excel
+ ExcelUtils.write(response, "宸ヨ壓鍙傛暟妯℃澘.xls", "鏁版嵁", MesPdProcessParamTemplateRespVO.class,
+ buildTemplateRespVOList(list));
+ }
+
+ // ==================== 鎷兼帴 VO ====================
+
+ private MesPdProcessParamTemplateRespVO buildTemplateRespVO(MesPdProcessParamTemplateDO template) {
+ return buildTemplateRespVOList(Collections.singletonList(template)).get(0);
+ }
+
+ private List<MesPdProcessParamTemplateRespVO> buildTemplateRespVOList(List<MesPdProcessParamTemplateDO> list) {
+ if (CollUtil.isEmpty(list)) {
+ return Collections.emptyList();
+ }
+ // 1. 鎵归噺鑾峰彇鎵�鏈夋ā鏉跨殑鏄庣粏
+ Map<Long, List<MesPdProcessParamTemplateDetailDO>> detailMap = new HashMap<>();
+ Set<Long> allUnitMeasureIds = new HashSet<>();
+ for (MesPdProcessParamTemplateDO template : list) {
+ List<MesPdProcessParamTemplateDetailDO> details =
+ templateService.getProcessParamTemplateDetailListByTemplateId(template.getId());
+ detailMap.put(template.getId(), details);
+ for (MesPdProcessParamTemplateDetailDO detail : details) {
+ if (detail.getUnitMeasureId() != null) {
+ allUnitMeasureIds.add(detail.getUnitMeasureId());
+ }
+ }
+ }
+ // 2. 鎵归噺鑾峰彇璁¢噺鍗曚綅
+ Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(allUnitMeasureIds);
+ // 3. 鎷兼帴 VO
+ return BeanUtils.toBean(list, MesPdProcessParamTemplateRespVO.class, vo -> {
+ List<MesPdProcessParamTemplateDetailDO> details = detailMap.get(vo.getId());
+ if (CollUtil.isNotEmpty(details)) {
+ List<MesPdProcessParamTemplateRespVO.DetailResp> detailResps = BeanUtils.toBean(
+ details, MesPdProcessParamTemplateRespVO.DetailResp.class, detailResp ->
+ MapUtils.findAndThen(unitMeasureMap, detailResp.getUnitMeasureId(),
+ unitMeasure -> detailResp.setUnitMeasureName(unitMeasure.getName()))
+ );
+ vo.setDetails(detailResps);
+ }
+ });
+ }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparamtemplate/vo/MesPdProcessParamTemplatePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparamtemplate/vo/MesPdProcessParamTemplatePageReqVO.java
new file mode 100644
index 0000000..d07df7d
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparamtemplate/vo/MesPdProcessParamTemplatePageReqVO.java
@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pd.processparamtemplate.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 宸ヨ壓鍙傛暟妯℃澘鍒嗛〉 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class MesPdProcessParamTemplatePageReqVO extends PageParam {
+
+ @Schema(description = "妯℃澘缂栫爜", example = "PPT2024001")
+ private String templateCode;
+
+ @Schema(description = "妯℃澘鍚嶇О", example = "娉ㄥ宸ヨ壓鍙傛暟妯℃澘")
+ private String templateName;
+
+ @Schema(description = "妯℃澘绫诲瀷", example = "1")
+ private Integer templateType;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparamtemplate/vo/MesPdProcessParamTemplateRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparamtemplate/vo/MesPdProcessParamTemplateRespVO.java
new file mode 100644
index 0000000..d61320e
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparamtemplate/vo/MesPdProcessParamTemplateRespVO.java
@@ -0,0 +1,83 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pd.processparamtemplate.vo;
+
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+import cn.iocoder.yudao.module.mes.enums.DictTypeConstants;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 宸ヨ壓鍙傛暟妯℃澘 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class MesPdProcessParamTemplateRespVO {
+
+ @Schema(description = "缂栧彿", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+ @ExcelProperty("缂栧彿")
+ private Long id;
+
+ @Schema(description = "妯℃澘缂栫爜", requiredMode = Schema.RequiredMode.REQUIRED, example = "PPT2024001")
+ @ExcelProperty("妯℃澘缂栫爜")
+ private String templateCode;
+
+ @Schema(description = "妯℃澘鍚嶇О", requiredMode = Schema.RequiredMode.REQUIRED, example = "娉ㄥ宸ヨ壓鍙傛暟妯℃澘")
+ @ExcelProperty("妯℃澘鍚嶇О")
+ private String templateName;
+
+ @Schema(description = "妯℃澘绫诲瀷", example = "1")
+ @ExcelProperty(value = "妯℃澘绫诲瀷", converter = DictConvert.class)
+ @DictFormat(DictTypeConstants.MES_PD_PROCESS_PARAM_TEMPLATE_TYPE)
+ private Integer templateType;
+
+ @Schema(description = "澶囨敞", example = "娴嬭瘯澶囨敞")
+ @ExcelProperty("澶囨敞")
+ private String remark;
+
+ @Schema(description = "鍒涘缓鏃堕棿", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("鍒涘缓鏃堕棿")
+ private LocalDateTime createTime;
+
+ @Schema(description = "妯℃澘鏄庣粏鍒楄〃")
+ private List<DetailResp> details;
+
+ @Schema(description = "妯℃澘鏄庣粏")
+ @Data
+ public static class DetailResp {
+
+ @Schema(description = "鏄庣粏缂栧彿", example = "1")
+ private Long id;
+
+ @Schema(description = "妯℃澘ID", example = "1")
+ private Long templateId;
+
+ @Schema(description = "宸ヨ壓鍙傛暟ID", example = "1")
+ private Long processParamId;
+
+ @Schema(description = "鍙傛暟缂栫爜", example = "PP2024001")
+ private String paramCode;
+
+ @Schema(description = "鍙傛暟鍚嶇О", example = "娓╁害")
+ private String paramName;
+
+ @Schema(description = "鍙傛暟绫诲瀷", example = "1")
+ private Integer paramType;
+
+ @Schema(description = "璁¢噺鍗曚綅ID", example = "1")
+ private Long unitMeasureId;
+
+ @Schema(description = "璁¢噺鍗曚綅鍚嶇О", example = "鈩�")
+ private String unitMeasureName;
+
+ @Schema(description = "鏄惁蹇呭~", example = "true")
+ private Boolean required;
+
+ @Schema(description = "澶囨敞", example = "娴嬭瘯澶囨敞")
+ private String remark;
+
+ }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparamtemplate/vo/MesPdProcessParamTemplateSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparamtemplate/vo/MesPdProcessParamTemplateSaveReqVO.java
new file mode 100644
index 0000000..b138a09
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/processparamtemplate/vo/MesPdProcessParamTemplateSaveReqVO.java
@@ -0,0 +1,50 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pd.processparamtemplate.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import java.util.List;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 宸ヨ壓鍙傛暟妯℃澘鏂板/淇敼 Request VO")
+@Data
+public class MesPdProcessParamTemplateSaveReqVO {
+
+ @Schema(description = "缂栧彿", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "1024")
+ private Long id;
+
+ @Schema(description = "妯℃澘鍚嶇О", requiredMode = Schema.RequiredMode.REQUIRED, example = "娉ㄥ宸ヨ壓鍙傛暟妯℃澘")
+ @NotBlank(message = "妯℃澘鍚嶇О涓嶈兘涓虹┖")
+ private String templateName;
+
+ @Schema(description = "妯℃澘绫诲瀷", example = "1")
+ private Integer templateType;
+
+ @Schema(description = "澶囨敞", example = "娴嬭瘯澶囨敞")
+ private String remark;
+
+ @Schema(description = "妯℃澘鏄庣粏鍒楄〃", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "妯℃澘鏄庣粏涓嶈兘涓虹┖")
+ @Valid
+ private List<Detail> details;
+
+ @Schema(description = "妯℃澘鏄庣粏")
+ @Data
+ public static class Detail {
+
+ @Schema(description = "宸ヨ壓鍙傛暟ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotNull(message = "宸ヨ壓鍙傛暟ID涓嶈兘涓虹┖")
+ private Long processParamId;
+
+ @Schema(description = "鏄惁蹇呭~锛堝彲瑕嗙洊鍙傛暟榛樿鍊硷級", example = "true")
+ private Boolean required;
+
+ @Schema(description = "澶囨敞锛堝彲瑕嗙洊鍙傛暟榛樿鍊硷級", example = "鑷畾涔夊娉�")
+ private String remark;
+
+ }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pd/processparam/MesPdProcessParamDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pd/processparam/MesPdProcessParamDO.java
new file mode 100644
index 0000000..788f8c7
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pd/processparam/MesPdProcessParamDO.java
@@ -0,0 +1,59 @@
+package cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparam;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.mes.enums.DictTypeConstants;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * MES 宸ヨ壓鍙傛暟 DO
+ *
+ * @author 鑺嬮亾婧愮爜
+ */
+@TableName("mes_pd_process_param")
+@KeySequence("mes_pd_process_param_seq") // 鐢ㄤ簬 Oracle銆丳ostgreSQL銆並ingbase銆丏B2銆丠2 鏁版嵁搴撶殑涓婚敭鑷銆傚鏋滄槸 MySQL 绛夋暟鎹簱锛屽彲涓嶅啓銆�
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class MesPdProcessParamDO extends BaseDO {
+
+ /**
+ * 缂栧彿
+ */
+ @TableId
+ private Long id;
+ /**
+ * 鍙傛暟缂栫爜
+ */
+ private String paramCode;
+ /**
+ * 鍙傛暟鍚嶇О
+ */
+ private String paramName;
+ /**
+ * 鍙傛暟绫诲瀷
+ *
+ * 瀛楀吀 {@link DictTypeConstants#MES_PD_PROCESS_PARAM_TYPE}
+ */
+ private Integer paramType;
+ /**
+ * 璁¢噺鍗曚綅ID
+ *
+ * 鍏宠仈 mes_md_unit_measure 鐨� id
+ */
+ private Long unitMeasureId;
+ /**
+ * 鏄惁蹇呭~
+ */
+ private Boolean required;
+ /**
+ * 澶囨敞
+ */
+ private String remark;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pd/processparamtemplate/MesPdProcessParamTemplateDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pd/processparamtemplate/MesPdProcessParamTemplateDO.java
new file mode 100644
index 0000000..dfca04d
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pd/processparamtemplate/MesPdProcessParamTemplateDO.java
@@ -0,0 +1,49 @@
+package cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparamtemplate;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.mes.enums.DictTypeConstants;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * MES 宸ヨ壓鍙傛暟妯℃澘 DO
+ *
+ * @author 鑺嬮亾婧愮爜
+ */
+@TableName("mes_pd_process_param_template")
+@KeySequence("mes_pd_process_param_template_seq") // 鐢ㄤ簬 Oracle銆丳ostgreSQL銆並ingbase銆丏B2銆丠2 鏁版嵁搴撶殑涓婚敭鑷銆傚鏋滄槸 MySQL 绛夋暟鎹簱锛屽彲涓嶅啓銆�
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class MesPdProcessParamTemplateDO extends BaseDO {
+
+ /**
+ * 缂栧彿
+ */
+ @TableId
+ private Long id;
+ /**
+ * 妯℃澘缂栫爜
+ */
+ private String templateCode;
+ /**
+ * 妯℃澘鍚嶇О
+ */
+ private String templateName;
+ /**
+ * 妯℃澘绫诲瀷
+ *
+ * 瀛楀吀 {@link DictTypeConstants#MES_PD_PROCESS_PARAM_TEMPLATE_TYPE}
+ */
+ private Integer templateType;
+ /**
+ * 澶囨敞
+ */
+ private String remark;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pd/processparamtemplate/MesPdProcessParamTemplateDetailDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pd/processparamtemplate/MesPdProcessParamTemplateDetailDO.java
new file mode 100644
index 0000000..db6e88d
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pd/processparamtemplate/MesPdProcessParamTemplateDetailDO.java
@@ -0,0 +1,69 @@
+package cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparamtemplate;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * MES 宸ヨ壓鍙傛暟妯℃澘鏄庣粏 DO
+ * <p>
+ * 蹇収琛細瀛樺偍鍏宠仈鏃跺伐鑹哄弬鏁扮殑鍓湰鍊硷紝鏀瑰彉宸ヨ壓鍙傛暟鍒楄〃鐨勫�间笉褰卞搷妯℃澘鏄庣粏銆�
+ * process_param_id 浠呬綔婧簮锛屾ā鏉夸笉浠庡弬鏁颁富琛ㄨ鍙栨樉绀哄�笺��
+ *
+ * @author 鑺嬮亾婧愮爜
+ */
+@TableName("mes_pd_process_param_template_detail")
+@KeySequence("mes_pd_process_param_template_detail_seq") // 鐢ㄤ簬 Oracle銆丳ostgreSQL銆並ingbase銆丏B2銆丠2 鏁版嵁搴撶殑涓婚敭鑷銆傚鏋滄槸 MySQL 绛夋暟鎹簱锛屽彲涓嶅啓銆�
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class MesPdProcessParamTemplateDetailDO extends BaseDO {
+
+ /**
+ * 缂栧彿
+ */
+ @TableId
+ private Long id;
+ /**
+ * 妯℃澘ID
+ *
+ * 鍏宠仈 {@link MesPdProcessParamTemplateDO#getId()}
+ */
+ private Long templateId;
+ /**
+ * 宸ヨ壓鍙傛暟ID锛堜粎浣滄函婧愶紝涓嶅奖鍝嶅揩鐓у�硷級
+ *
+ * 鍏宠仈 mes_pd_process_param 鐨� id
+ */
+ private Long processParamId;
+ /**
+ * 鍙傛暟缂栫爜锛堝揩鐓э級
+ */
+ private String paramCode;
+ /**
+ * 鍙傛暟鍚嶇О锛堝揩鐓э級
+ */
+ private String paramName;
+ /**
+ * 鍙傛暟绫诲瀷锛堝揩鐓э級
+ */
+ private Integer paramType;
+ /**
+ * 璁¢噺鍗曚綅ID锛堝揩鐓э級
+ */
+ private Long unitMeasureId;
+ /**
+ * 鏄惁蹇呭~锛堝揩鐓э級
+ */
+ private Boolean required;
+ /**
+ * 澶囨敞锛堝揩鐓э級
+ */
+ private String remark;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/processparam/MesPdProcessParamMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/processparam/MesPdProcessParamMapper.java
new file mode 100644
index 0000000..6236a0f
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/processparam/MesPdProcessParamMapper.java
@@ -0,0 +1,25 @@
+package cn.iocoder.yudao.module.mes.dal.mysql.pd.processparam;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.mes.controller.admin.pd.processparam.vo.MesPdProcessParamPageReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparam.MesPdProcessParamDO;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface MesPdProcessParamMapper extends BaseMapperX<MesPdProcessParamDO> {
+
+ default PageResult<MesPdProcessParamDO> selectPage(MesPdProcessParamPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX<MesPdProcessParamDO>()
+ .likeIfPresent(MesPdProcessParamDO::getParamCode, reqVO.getParamCode())
+ .likeIfPresent(MesPdProcessParamDO::getParamName, reqVO.getParamName())
+ .eqIfPresent(MesPdProcessParamDO::getParamType, reqVO.getParamType())
+ .orderByDesc(MesPdProcessParamDO::getId));
+ }
+
+ default MesPdProcessParamDO selectByParamCode(String paramCode) {
+ return selectOne(MesPdProcessParamDO::getParamCode, paramCode);
+ }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/processparamtemplate/MesPdProcessParamTemplateDetailMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/processparamtemplate/MesPdProcessParamTemplateDetailMapper.java
new file mode 100644
index 0000000..f19da76
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/processparamtemplate/MesPdProcessParamTemplateDetailMapper.java
@@ -0,0 +1,20 @@
+package cn.iocoder.yudao.module.mes.dal.mysql.pd.processparamtemplate;
+
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparamtemplate.MesPdProcessParamTemplateDetailDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface MesPdProcessParamTemplateDetailMapper extends BaseMapperX<MesPdProcessParamTemplateDetailDO> {
+
+ default List<MesPdProcessParamTemplateDetailDO> selectListByTemplateId(Long templateId) {
+ return selectList(MesPdProcessParamTemplateDetailDO::getTemplateId, templateId);
+ }
+
+ default int deleteByTemplateId(Long templateId) {
+ return delete(MesPdProcessParamTemplateDetailDO::getTemplateId, templateId);
+ }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/processparamtemplate/MesPdProcessParamTemplateMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/processparamtemplate/MesPdProcessParamTemplateMapper.java
new file mode 100644
index 0000000..c92a143
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/processparamtemplate/MesPdProcessParamTemplateMapper.java
@@ -0,0 +1,25 @@
+package cn.iocoder.yudao.module.mes.dal.mysql.pd.processparamtemplate;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.mes.controller.admin.pd.processparamtemplate.vo.MesPdProcessParamTemplatePageReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparamtemplate.MesPdProcessParamTemplateDO;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface MesPdProcessParamTemplateMapper extends BaseMapperX<MesPdProcessParamTemplateDO> {
+
+ default PageResult<MesPdProcessParamTemplateDO> selectPage(MesPdProcessParamTemplatePageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX<MesPdProcessParamTemplateDO>()
+ .likeIfPresent(MesPdProcessParamTemplateDO::getTemplateCode, reqVO.getTemplateCode())
+ .likeIfPresent(MesPdProcessParamTemplateDO::getTemplateName, reqVO.getTemplateName())
+ .eqIfPresent(MesPdProcessParamTemplateDO::getTemplateType, reqVO.getTemplateType())
+ .orderByDesc(MesPdProcessParamTemplateDO::getId));
+ }
+
+ default MesPdProcessParamTemplateDO selectByTemplateCode(String templateCode) {
+ return selectOne(MesPdProcessParamTemplateDO::getTemplateCode, templateCode);
+ }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/processparam/MesPdProcessParamService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/processparam/MesPdProcessParamService.java
new file mode 100644
index 0000000..6a07247
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/processparam/MesPdProcessParamService.java
@@ -0,0 +1,85 @@
+package cn.iocoder.yudao.module.mes.service.pd.processparam;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.mes.controller.admin.pd.processparam.vo.MesPdProcessParamPageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pd.processparam.vo.MesPdProcessParamSaveReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparam.MesPdProcessParamDO;
+import jakarta.validation.Valid;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * MES 宸ヨ壓鍙傛暟 Service 鎺ュ彛
+ *
+ * @author 鑺嬮亾婧愮爜
+ */
+public interface MesPdProcessParamService {
+
+ /**
+ * 鍒涘缓宸ヨ壓鍙傛暟
+ *
+ * @param createReqVO 鍒涘缓淇℃伅
+ * @return 缂栧彿
+ */
+ Long createProcessParam(@Valid MesPdProcessParamSaveReqVO createReqVO);
+
+ /**
+ * 鏇存柊宸ヨ壓鍙傛暟
+ *
+ * @param updateReqVO 鏇存柊淇℃伅
+ */
+ void updateProcessParam(@Valid MesPdProcessParamSaveReqVO updateReqVO);
+
+ /**
+ * 鍒犻櫎宸ヨ壓鍙傛暟
+ *
+ * @param id 缂栧彿
+ */
+ void deleteProcessParam(Long id);
+
+ /**
+ * 鏍¢獙宸ヨ壓鍙傛暟瀛樺湪
+ *
+ * @param id 缂栧彿
+ * @return 宸ヨ壓鍙傛暟
+ */
+ MesPdProcessParamDO validateProcessParamExists(Long id);
+
+ /**
+ * 鑾峰緱宸ヨ壓鍙傛暟
+ *
+ * @param id 缂栧彿
+ * @return 宸ヨ壓鍙傛暟
+ */
+ MesPdProcessParamDO getProcessParam(Long id);
+
+ /**
+ * 鑾峰緱宸ヨ壓鍙傛暟鍒嗛〉
+ *
+ * @param pageReqVO 鍒嗛〉鏌ヨ
+ * @return 宸ヨ壓鍙傛暟鍒嗛〉
+ */
+ PageResult<MesPdProcessParamDO> getProcessParamPage(MesPdProcessParamPageReqVO pageReqVO);
+
+ /**
+ * 鑾峰緱宸ヨ壓鍙傛暟鍒楄〃
+ *
+ * @param ids 缂栧彿闆嗗悎
+ * @return 宸ヨ壓鍙傛暟鍒楄〃
+ */
+ List<MesPdProcessParamDO> getProcessParamList(Collection<Long> ids);
+
+ /**
+ * 鑾峰緱宸ヨ壓鍙傛暟 Map
+ *
+ * @param ids 缂栧彿闆嗗悎
+ * @return 宸ヨ壓鍙傛暟 Map
+ */
+ default Map<Long, MesPdProcessParamDO> getProcessParamMap(Collection<Long> ids) {
+ List<MesPdProcessParamDO> list = getProcessParamList(ids);
+ return cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap(list, MesPdProcessParamDO::getId);
+ }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/processparam/MesPdProcessParamServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/processparam/MesPdProcessParamServiceImpl.java
new file mode 100644
index 0000000..7ef288e
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/processparam/MesPdProcessParamServiceImpl.java
@@ -0,0 +1,91 @@
+package cn.iocoder.yudao.module.mes.service.pd.processparam;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.mes.controller.admin.pd.processparam.vo.MesPdProcessParamPageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pd.processparam.vo.MesPdProcessParamSaveReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparam.MesPdProcessParamDO;
+import cn.iocoder.yudao.module.mes.dal.mysql.pd.processparam.MesPdProcessParamMapper;
+import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum;
+import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
+import jakarta.annotation.Resource;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.Collection;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
+
+/**
+ * MES 宸ヨ壓鍙傛暟 Service 瀹炵幇绫�
+ *
+ * @author 鑺嬮亾婧愮爜
+ */
+@Service
+@Validated
+public class MesPdProcessParamServiceImpl implements MesPdProcessParamService {
+
+ @Resource
+ private MesPdProcessParamMapper processParamMapper;
+
+ @Resource
+ @Lazy
+ private MesMdAutoCodeRecordService autoCodeRecordService;
+
+ @Override
+ public Long createProcessParam(MesPdProcessParamSaveReqVO createReqVO) {
+ // 鐢熸垚鍙傛暟缂栫爜
+ String paramCode = autoCodeRecordService.generateAutoCode(
+ MesMdAutoCodeRuleCodeEnum.PD_PROCESS_PARAM_CODE.getCode());
+ // 鎻掑叆
+ MesPdProcessParamDO processParam = BeanUtils.toBean(createReqVO, MesPdProcessParamDO.class);
+ processParam.setParamCode(paramCode);
+ processParamMapper.insert(processParam);
+ return processParam.getId();
+ }
+
+ @Override
+ public void updateProcessParam(MesPdProcessParamSaveReqVO updateReqVO) {
+ // 鏍¢獙瀛樺湪
+ validateProcessParamExists(updateReqVO.getId());
+ // 鏇存柊
+ MesPdProcessParamDO updateObj = BeanUtils.toBean(updateReqVO, MesPdProcessParamDO.class);
+ processParamMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteProcessParam(Long id) {
+ // 鏍¢獙瀛樺湪
+ validateProcessParamExists(id);
+ // 鍒犻櫎
+ processParamMapper.deleteById(id);
+ }
+
+ @Override
+ public MesPdProcessParamDO validateProcessParamExists(Long id) {
+ MesPdProcessParamDO processParam = processParamMapper.selectById(id);
+ if (processParam == null) {
+ throw exception(PD_PROCESS_PARAM_NOT_EXISTS);
+ }
+ return processParam;
+ }
+
+ @Override
+ public MesPdProcessParamDO getProcessParam(Long id) {
+ return processParamMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult<MesPdProcessParamDO> getProcessParamPage(MesPdProcessParamPageReqVO pageReqVO) {
+ return processParamMapper.selectPage(pageReqVO);
+ }
+
+ @Override
+ public List<MesPdProcessParamDO> getProcessParamList(Collection<Long> ids) {
+ return processParamMapper.selectBatchIds(ids);
+ }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/processparamtemplate/MesPdProcessParamTemplateService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/processparamtemplate/MesPdProcessParamTemplateService.java
new file mode 100644
index 0000000..50f897f
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/processparamtemplate/MesPdProcessParamTemplateService.java
@@ -0,0 +1,73 @@
+package cn.iocoder.yudao.module.mes.service.pd.processparamtemplate;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.mes.controller.admin.pd.processparamtemplate.vo.MesPdProcessParamTemplatePageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pd.processparamtemplate.vo.MesPdProcessParamTemplateSaveReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparamtemplate.MesPdProcessParamTemplateDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparamtemplate.MesPdProcessParamTemplateDetailDO;
+import jakarta.validation.Valid;
+
+import java.util.List;
+
+/**
+ * MES 宸ヨ壓鍙傛暟妯℃澘 Service 鎺ュ彛
+ *
+ * @author 鑺嬮亾婧愮爜
+ */
+public interface MesPdProcessParamTemplateService {
+
+ /**
+ * 鍒涘缓宸ヨ壓鍙傛暟妯℃澘
+ *
+ * @param createReqVO 鍒涘缓淇℃伅
+ * @return 缂栧彿
+ */
+ Long createProcessParamTemplate(@Valid MesPdProcessParamTemplateSaveReqVO createReqVO);
+
+ /**
+ * 鏇存柊宸ヨ壓鍙傛暟妯℃澘
+ *
+ * @param updateReqVO 鏇存柊淇℃伅
+ */
+ void updateProcessParamTemplate(@Valid MesPdProcessParamTemplateSaveReqVO updateReqVO);
+
+ /**
+ * 鍒犻櫎宸ヨ壓鍙傛暟妯℃澘
+ *
+ * @param id 缂栧彿
+ */
+ void deleteProcessParamTemplate(Long id);
+
+ /**
+ * 鏍¢獙宸ヨ壓鍙傛暟妯℃澘瀛樺湪
+ *
+ * @param id 缂栧彿
+ * @return 宸ヨ壓鍙傛暟妯℃澘
+ */
+ MesPdProcessParamTemplateDO validateProcessParamTemplateExists(Long id);
+
+ /**
+ * 鑾峰緱宸ヨ壓鍙傛暟妯℃澘
+ *
+ * @param id 缂栧彿
+ * @return 宸ヨ壓鍙傛暟妯℃澘
+ */
+ MesPdProcessParamTemplateDO getProcessParamTemplate(Long id);
+
+ /**
+ * 鑾峰緱宸ヨ壓鍙傛暟妯℃澘鍒嗛〉
+ *
+ * @param pageReqVO 鍒嗛〉鏌ヨ
+ * @return 宸ヨ壓鍙傛暟妯℃澘鍒嗛〉
+ */
+ PageResult<MesPdProcessParamTemplateDO> getProcessParamTemplatePage(MesPdProcessParamTemplatePageReqVO pageReqVO);
+
+ /**
+ * 鑾峰緱宸ヨ壓鍙傛暟妯℃澘鏄庣粏鍒楄〃
+ *
+ * @param templateId 妯℃澘ID
+ * @return 妯℃澘鏄庣粏鍒楄〃
+ */
+ List<MesPdProcessParamTemplateDetailDO> getProcessParamTemplateDetailListByTemplateId(Long templateId);
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/processparamtemplate/MesPdProcessParamTemplateServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/processparamtemplate/MesPdProcessParamTemplateServiceImpl.java
new file mode 100644
index 0000000..9d67013
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/processparamtemplate/MesPdProcessParamTemplateServiceImpl.java
@@ -0,0 +1,146 @@
+package cn.iocoder.yudao.module.mes.service.pd.processparamtemplate;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.mes.controller.admin.pd.processparamtemplate.vo.MesPdProcessParamTemplatePageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pd.processparamtemplate.vo.MesPdProcessParamTemplateSaveReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparam.MesPdProcessParamDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparamtemplate.MesPdProcessParamTemplateDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparamtemplate.MesPdProcessParamTemplateDetailDO;
+import cn.iocoder.yudao.module.mes.dal.mysql.pd.processparamtemplate.MesPdProcessParamTemplateDetailMapper;
+import cn.iocoder.yudao.module.mes.dal.mysql.pd.processparamtemplate.MesPdProcessParamTemplateMapper;
+import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum;
+import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
+import cn.iocoder.yudao.module.mes.service.pd.processparam.MesPdProcessParamService;
+import jakarta.annotation.Resource;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
+
+/**
+ * MES 宸ヨ壓鍙傛暟妯℃澘 Service 瀹炵幇绫�
+ *
+ * @author 鑺嬮亾婧愮爜
+ */
+@Service
+@Validated
+public class MesPdProcessParamTemplateServiceImpl implements MesPdProcessParamTemplateService {
+
+ @Resource
+ private MesPdProcessParamTemplateMapper templateMapper;
+
+ @Resource
+ private MesPdProcessParamTemplateDetailMapper detailMapper;
+
+ @Resource
+ @Lazy
+ private MesPdProcessParamService processParamService;
+
+ @Resource
+ @Lazy
+ private MesMdAutoCodeRecordService autoCodeRecordService;
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Long createProcessParamTemplate(MesPdProcessParamTemplateSaveReqVO createReqVO) {
+ // 1. 鐢熸垚妯℃澘缂栫爜
+ String templateCode = autoCodeRecordService.generateAutoCode(
+ MesMdAutoCodeRuleCodeEnum.PD_PROCESS_PARAM_TEMPLATE_CODE.getCode());
+ // 2. 鎻掑叆妯℃澘涓昏〃
+ MesPdProcessParamTemplateDO template = BeanUtils.toBean(createReqVO, MesPdProcessParamTemplateDO.class);
+ template.setTemplateCode(templateCode);
+ templateMapper.insert(template);
+ // 3. 蹇収宸ヨ壓鍙傛暟鍊煎埌鏄庣粏涓�
+ createTemplateDetails(template.getId(), createReqVO.getDetails());
+ return template.getId();
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void updateProcessParamTemplate(MesPdProcessParamTemplateSaveReqVO updateReqVO) {
+ // 1. 鏍¢獙瀛樺湪
+ validateProcessParamTemplateExists(updateReqVO.getId());
+ // 2. 鏇存柊妯℃澘涓昏〃
+ MesPdProcessParamTemplateDO updateObj = BeanUtils.toBean(updateReqVO, MesPdProcessParamTemplateDO.class);
+ templateMapper.updateById(updateObj);
+ // 3. 鍒犻櫎鏃ф槑缁嗗苟閲嶆柊鎻掑叆锛堝揩鐓фā寮忥細鍏堝垹鍚庢彃锛�
+ detailMapper.deleteByTemplateId(updateReqVO.getId());
+ createTemplateDetails(updateReqVO.getId(), updateReqVO.getDetails());
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void deleteProcessParamTemplate(Long id) {
+ // 1. 鏍¢獙瀛樺湪
+ validateProcessParamTemplateExists(id);
+ // 2. 鍒犻櫎鏄庣粏
+ detailMapper.deleteByTemplateId(id);
+ // 3. 鍒犻櫎妯℃澘涓昏〃
+ templateMapper.deleteById(id);
+ }
+
+ @Override
+ public MesPdProcessParamTemplateDO validateProcessParamTemplateExists(Long id) {
+ MesPdProcessParamTemplateDO template = templateMapper.selectById(id);
+ if (template == null) {
+ throw exception(PD_PROCESS_PARAM_TEMPLATE_NOT_EXISTS);
+ }
+ return template;
+ }
+
+ @Override
+ public MesPdProcessParamTemplateDO getProcessParamTemplate(Long id) {
+ return templateMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult<MesPdProcessParamTemplateDO> getProcessParamTemplatePage(MesPdProcessParamTemplatePageReqVO pageReqVO) {
+ return templateMapper.selectPage(pageReqVO);
+ }
+
+ @Override
+ public List<MesPdProcessParamTemplateDetailDO> getProcessParamTemplateDetailListByTemplateId(Long templateId) {
+ return detailMapper.selectListByTemplateId(templateId);
+ }
+
+ /**
+ * 鍒涘缓妯℃澘鏄庣粏锛堝揩鐓ч�昏緫锛氫粠宸ヨ壓鍙傛暟涓昏〃澶嶅埗鍊煎埌鏄庣粏锛�
+ *
+ * @param templateId 妯℃澘ID
+ * @param detailVOs 鏄庣粏VO鍒楄〃
+ */
+ private void createTemplateDetails(Long templateId, List<MesPdProcessParamTemplateSaveReqVO.Detail> detailVOs) {
+ if (detailVOs == null || detailVOs.isEmpty()) {
+ return;
+ }
+ List<MesPdProcessParamTemplateDetailDO> detailDOs = new ArrayList<>();
+ for (MesPdProcessParamTemplateSaveReqVO.Detail detailVO : detailVOs) {
+ // 鏌ユ壘婧愬伐鑹哄弬鏁�
+ MesPdProcessParamDO param = processParamService.getProcessParam(detailVO.getProcessParamId());
+ if (param == null) {
+ throw exception(PD_PROCESS_PARAM_NOT_EXISTS);
+ }
+ // 灏嗗�间粠鍙傛暟澶嶅埗鍒版槑缁嗭紙蹇収锛侊級
+ MesPdProcessParamTemplateDetailDO detail = MesPdProcessParamTemplateDetailDO.builder()
+ .templateId(templateId)
+ .processParamId(param.getId()) // 浠呬綔婧簮
+ .paramCode(param.getParamCode()) // 澶嶅埗
+ .paramName(param.getParamName()) // 澶嶅埗
+ .paramType(param.getParamType()) // 澶嶅埗
+ .unitMeasureId(param.getUnitMeasureId()) // 澶嶅埗
+ .required(detailVO.getRequired() != null ? detailVO.getRequired() : param.getRequired()) // 鍏佽瑕嗙洊
+ .remark(detailVO.getRemark() != null ? detailVO.getRemark() : param.getRemark()) // 鍏佽瑕嗙洊
+ .build();
+ detailDOs.add(detail);
+ }
+ detailDOs.forEach(detailMapper::insert);
+ }
+
+}
--
Gitblit v1.9.3