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