Selaa lähdekoodia

合同及采购接口

ouyj 3 päivää sitten
vanhempi
commit
fc2e486af3

+ 320 - 0
src/main/bpm/com/yw/bpm/client/action/BpmClientFlowInfoForMesAction.java

@@ -0,0 +1,320 @@
+package com.yw.bpm.client.action;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.yw.contract.contract.model.*;
+import com.yw.contract.contract.service.ContractEntryService;
+import com.yw.contract.contract.service.ContractPurchaseService;
+import com.yw.core.utils.RegisterCodeImpl;
+import org.springframework.context.ApplicationContext;
+
+import com.yw.bpm.form.dao.FormDao;
+import com.yw.bpm.form.dao.FormEnumDao;
+import com.yw.bpm.form.dao.FormSealInfoDao;
+import com.yw.bpm.form.model.FormElement;
+import com.yw.bpm.form.model.FormEnumValue;
+import com.yw.bpm.form.model.FormInfo;
+import com.yw.bpm.form.model.FormSealInfo;
+import com.yw.bpm.instance.dao.FlowDao;
+import com.yw.bpm.instance.model.FileInfo;
+import com.yw.bpm.instance.model.FlowInstance;
+import com.yw.bpm.instance.model.TacheInstance;
+import com.yw.bpm.instance.service.FlowService;
+import com.yw.bpm.seal.dao.SealDao;
+import com.yw.bpm.seal.model.SealInfo;
+import com.yw.bpm.system.util.JsonUtil;
+import com.yw.core.clientImpl.model.ResultVo;
+import com.yw.core.clientImpl.service.RequestAbs;
+import com.yw.core.common.DataCommonDao;
+import com.yw.core.session.AppSession;
+import com.yw.core.utils.Constant;
+import com.yw.core.utils.DateUtil;
+import com.yw.core.utils.StringUtil;
+import com.yw.eu.base.system.model.UploadFile;
+import com.yw.eu.base.system.service.UploadFileService;
+
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+
+/**
+ * 获取流程综合信息接口(精简版)
+ * 包含:流程、表单数据、附件、流转过程详情
+ */
+public class BpmClientFlowInfoForMesAction extends RequestAbs {
+	public final String serviceId = "bpm_getFlowInfoForMes";
+
+	private ApplicationContext cxt = null;
+
+	@Override
+	public String getResult() {
+		// 获取请求的参数
+		String param = getParameters();
+		JSONObject json = JSONObject.fromObject(param);
+		String insId = json.getString("insId");
+
+		// 返回数据
+		ResultVo rv = null;
+		if (!StringUtil.isEmpty(insId)) {
+			String responseJson = this.getFlowSimpleInfo(insId);
+			if (!"0".equals(responseJson)) {
+				rv = new ResultVo();
+				rv.setReturnCode("1");
+				rv.setReturnMsg("success");
+				rv.setReturnParams(responseJson);
+				return JSONObject.fromObject(rv, config).toString();
+			}
+		}
+		rv = new ResultVo();
+		rv.setReturnCode("0");
+		rv.setReturnMsg("failed");
+		rv.setReturnParams("");
+		return JSONObject.fromObject(rv, config).toString();
+	}
+
+	/**
+	 * 获取流程精简信息
+	 * @param insId 流程实例ID
+	 * @return JSON字符串
+	 */
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	private String getFlowSimpleInfo(String insId) {
+		try {
+			if (null == cxt) {
+				cxt = AppSession.getApplicationContext();
+			}
+			
+			FlowDao flowDao = (FlowDao) cxt.getBean("bpmFlowDao");
+			FlowService flowService = (FlowService) cxt.getBean("bpmFlowService");
+			FormDao bpmFormDao = (FormDao) cxt.getBean("bpmFormDao");
+			FormEnumDao bpmFormEnumDao = (FormEnumDao) cxt.getBean("bpmFormEnumDao");
+			DataCommonDao dataCommonDao = (DataCommonDao) cxt.getBean("dataCommonDao");
+			FormSealInfoDao bpmFormSealDao = (FormSealInfoDao) cxt.getBean("bpmFormSealDao");
+			SealDao bpmSealDao = (SealDao) cxt.getBean("bpmSealDao");
+			UploadFileService uploadFileService = (UploadFileService) cxt.getBean("uploadFileService");
+			
+			// 获取流程实例
+			FlowInstance finstances = flowDao.getFlowInstanceById(insId);
+			if (finstances == null) {
+				return "0";
+			}
+			
+			Map<String, Object> info = flowService.toInfo(insId);
+			if (info == null) {
+				return "0";
+			}
+			
+			FlowInstance flow = (FlowInstance) (info.get("flow"));
+			if (flow == null) {
+				return "0";
+			}
+			
+			String formId = flow.getFormId().getFormId();
+			String formInsId = flow.getFormInsId();
+			String modelId = flow.getModelId().getModelId();
+
+			// 0. 获取流程基本信息
+			Map<String, Object> flowMap = new HashMap<String, Object>();
+			flowMap.put("insName", flow.getInsName());
+			flowMap.put("insRemark", flow.getInsRemark());
+			flowMap.put("name", flow.getCreator().getUsername());
+			flowMap.put("insId", flow.getInsId());
+			flowMap.put("createdate", flow.getCreatedate());
+			flowMap.put("finishdate", flow.getFinishdate());
+			flowMap.put("canceldate", flow.getCanceldate());
+			
+			// 1. 获取附件信息
+			Map<String, Object> fileMap = new HashMap<String, Object>();
+			List<Map<String, String>> filelist = new ArrayList<Map<String, String>>();
+			String fileIds = "";
+			List<FileInfo> fileList = (List<FileInfo>) (info.get("fileList"));
+			if (fileList != null && fileList.size() > 0) {
+				for (FileInfo fi : fileList) {
+					String fileId = fi.getFileId().getUniversalid();
+					UploadFile uploadFile = new UploadFile();
+					uploadFile.setFileId(StringUtil.strToLong(fileId));
+					uploadFile = uploadFileService.loadUploadFile(uploadFile);
+					if (uploadFile != null) {
+						fileIds = fileIds + "," + fileId;
+						Map<String, String> map = new HashMap<String, String>();
+						map.put("fileId", uploadFile.getFileId().toString());
+						map.put("fileName", uploadFile.getSrcFile());
+						map.put("path", uploadFile.getPath());
+						filelist.add(map);
+					}
+				}
+			}
+			fileMap.put("fileIds", fileIds);
+			fileMap.put("files", filelist);
+			
+			// 2. 获取表单元素信息(仅非重复表)
+			List<Map<String, String>> elementList = new ArrayList<Map<String, String>>();
+			
+			/*if (!StringUtil.isEmptyStr(formId) && !StringUtil.isEmptyStr(formInsId)) {
+				FormInfo infoForm = bpmFormDao.getFormInfoById(formId);
+				String tableName = infoForm.getTable();
+				
+				// 查询非重复表字段
+				Map<String, String> conditions = new HashMap<String, String>();
+				conditions.put("formId", formId);
+				conditions.put("isGroup", "0");
+				conditions.put("!type", "-1");
+				List<FormElement> formElementList = bpmFormDao.getListOfFormElementByConditions(conditions);
+				
+				for (int i = 0; i < formElementList.size(); i++) {
+					FormElement fe = formElementList.get(i);
+					Map<String, String> element = new HashMap<String, String>();
+					
+					// 处理枚举类型
+					if (("2".equals(fe.getType().getValue()) || "4".equals(fe.getType().getValue())
+							|| "5".equals(fe.getType().getValue())) && fe.getTypeDetail() != null) {
+						String n_type_detail = fe.getTypeDetail();
+						List<FormEnumValue> enumlist = bpmFormEnumDao.getListOfFormEnumValueByEnumId(n_type_detail);
+						String enumArray[] = new String[] { "enumVname" };
+						String enumVname = JsonUtil.getJson(enumlist, enumArray, false);
+						String enumstr = "{enum:" + enumVname + "}";
+						fe.setTypeDetail(enumstr);
+					} else {
+						String enumstr = "{}";
+						fe.setTypeDetail(enumstr);
+					}
+					
+					String v_table_field = fe.getTableField();
+					StringBuffer sql = new StringBuffer("SELECT ");
+					sql.append(v_table_field + " from " + tableName);
+					sql.append(" WHERE l_form_ins_id=" + formInsId);
+					
+					element.put("elementName", fe.getElementName().replaceFirst("my:", ""));
+					element.put("tableField", fe.getTableField());
+					
+					List<Map<String, Object>> list = dataCommonDao.querySql(sql.toString());
+					if (list.size() > 0) {
+						String defaultValue = "";
+						if (list.get(0).get(v_table_field) != null) {
+							defaultValue = (list.get(0).get(v_table_field)).toString();
+						}
+						
+						// 日期格式化
+						if ("2".equals(formElementList.get(i).getFieldType().getValue())) {
+							defaultValue = DateUtil.formatStringDate(defaultValue, Constant.DATE_FORMATE);
+						}
+						
+						// 印章处理
+						if ("13".equals(formElementList.get(i).getType().getValue())) {
+							FormSealInfo formSealInfo = bpmFormSealDao.getFormSealInfoById(defaultValue);
+							if (formSealInfo != null) {
+								String sealId = formSealInfo.getFormSealId();
+								String type = formSealInfo.getType();
+								if ("1".equals(type)) {
+									defaultValue = sealId;
+								} else {
+									SealInfo sealInfo = bpmSealDao.getSealInfoById(sealId);
+									defaultValue = sealInfo.getSealFileId().getUniversalid();
+									String sealImgPath = sealInfo.getSealFileId().getPath();
+									element.put("sealImgPath", sealImgPath);
+								}
+							}
+						}
+						
+						// 密码字段脱敏
+						if ("25".equals(fe.getType().getValue())) {
+							defaultValue = "******";
+						}
+						
+						element.put("defaultValue", defaultValue);
+					} else {
+						element.put("defaultValue", "");
+					}
+					
+					elementList.add(element);
+				}
+			}*/
+			
+			// 3. 获取流转过程详情(control != -1 的逻辑)
+			List<TacheInstance> tacheList = flowService.getListOfTacheInstanceForProcess(insId);
+			List<Map<String, Object>> processList = new ArrayList<Map<String, Object>>();
+			
+			for (TacheInstance tacheInstance : tacheList) {
+				Map<String, Object> map = new HashMap<String, Object>();
+				List<Map<String, String>> tfilelist = new ArrayList<Map<String, String>>();
+				
+				map.put("tmodelName", tacheInstance.getTmodelId().getTmodelName());
+				map.put("name", tacheInstance.getUser().getUsername());
+				map.put("remark", tacheInstance.getRemark());
+				map.put("createdate", tacheInstance.getCreatedate());
+				map.put("finishdate", tacheInstance.getFinishdate());
+				map.put("dataName", tacheInstance.getState().getDataName());
+				map.put("fileId", "");
+				map.put("files", tfilelist);
+				map.put("tmodelId", tacheInstance.getTmodelId().getTmodelId());
+				map.put("state", tacheInstance.getState().getValue());
+				map.put("groupName", tacheInstance.getGroupxuserid().getGroupId().getGroupName());
+				map.put("positionName", tacheInstance.getGroupxuserid().getPositionId().getPositionName());
+				map.put("processType", tacheInstance.getProcess_type());
+				
+				processList.add(map);
+			}
+
+			//4、获取自定义流程表单
+			if("200001".equals(formId)){
+				//采购申请表单
+				ContractPurchaseService contractPurchaseService = (ContractPurchaseService) cxt.getBean("contractPurchaseService");
+				ContractPurchaseForm contractPurchaseForm = new ContractPurchaseForm();
+				contractPurchaseForm.setlFormInsId(Long.valueOf(formInsId));
+				contractPurchaseForm = contractPurchaseService.getContractPurchaseForm(contractPurchaseForm);
+				ContractPurchaseDetail contractPurchaseDetail = new ContractPurchaseDetail();
+				contractPurchaseDetail.setlFormInsId(Long.valueOf(formInsId));
+				@SuppressWarnings("unchecked")
+				List<ContractPurchaseDetail> contractPurchaseDetailList = (List<ContractPurchaseDetail>) (List<?>) contractPurchaseService.getObjectList(contractPurchaseDetail);
+				contractPurchaseForm.setDetails(contractPurchaseDetailList);
+				flowMap.put("contractPurchaseForm", contractPurchaseForm);
+				//flowMap.put("contractPurchaseDetailList", contractPurchaseDetailList);
+			}else if("200002".equals(formId)){
+				//合同申请表单
+				ContractEntryService contractEntryService = (ContractEntryService) cxt.getBean("contractEntryService");
+				ContractInfo contractInfo = new ContractInfo();
+				contractInfo.setUniversalid(Long.valueOf(formInsId));
+				contractInfo = (ContractInfo) contractEntryService.getObject(contractInfo);
+				List<ContractMaterial> contractMaterialList = contractEntryService.getContractMaterialListByContractId(contractInfo.getUniversalid());
+				List<ContractPayment> contractPaymentList = contractEntryService.getContractPaymentListByContractId(contractInfo.getUniversalid());
+				contractInfo.setContractMaterialList(contractMaterialList);
+				contractInfo.setContractPaymentList(contractPaymentList);
+				flowMap.put("contractInfo", contractInfo);
+				//flowMap.put("contractMaterialList", contractMaterialList);
+				//flowMap.put("contractPaymentList", contractPaymentList);
+			}
+			// 组装返回数据
+			String flowStr = JsonUtil.getJson(flowMap, true);
+			String formElements = JSONArray.fromObject(elementList).toString();
+			String fileListStr = JsonUtil.getJson(fileMap, true);
+			String processListStr = JsonUtil.getJson(processList, true);
+			
+			return ("{\"flow\":" + flowStr + 
+					//",\"formElements\":" + formElements + 
+					",\"fileList\":" + fileListStr + 
+					",\"processList\":" + processListStr + 
+					"}").replaceAll(":null", ":\"\"");
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+			return "0";
+		}
+	}
+
+	@Override
+	public String getServiceId() {
+		return serviceId;
+	}
+
+	public static void main(String[] args) throws Exception {
+		String url = "http://localhost:8180/ynet/clientServices.do?iscrypt=1";
+		/*String param = "{\"serviceId\":\"bpm_getFlowInfoForMes\"," +
+				"\"params\":{\"insId\":\"144125539930700\"}}";*/
+		String param = "{\"serviceId\":\"bpm_getFlowInfoForMes\"," +
+				"\"params\":{\"insId\":\"595068063885800\"}}";
+		String rs = RegisterCodeImpl.requestPage(url, param);
+		System.out.println(rs);
+	}
+}

+ 153 - 4
src/main/bpm/com/yw/bpm/client/action/BpmClientFlowStartFromMesAction.java

@@ -8,6 +8,10 @@ import java.util.List;
 import java.util.Map;
 
 import com.yw.bpm.instance.service.FormInstanceService;
+import com.yw.bpm.system.util.JsonUtil;
+import com.yw.contract.contract.model.*;
+import com.yw.eu.base.company.model.CompanyModel;
+import com.yw.eu.base.company.service.CompanyRegisterService;
 import org.springframework.context.ApplicationContext;
 
 import com.yw.bpm.client.service.BpmClientFlowSubProcessService;
@@ -25,8 +29,7 @@ import com.yw.bpm.system.util.SystemUtil;
 import com.yw.bpm.tache.model.TacheModel;
 import com.yw.bpm.task.model.Task;
 import com.yw.bpm.zxlc.service.ZxlcLinkUserService;
-import com.yw.contract.contract.model.ContractPurchaseDetail;
-import com.yw.contract.contract.model.ContractPurchaseForm;
+import com.yw.contract.contract.service.ContractEntryService;
 import com.yw.contract.contract.service.ContractPurchaseService;
 import com.yw.core.clientImpl.model.ResultVo;
 import com.yw.core.clientImpl.service.RequestAbs;
@@ -82,11 +85,15 @@ public class BpmClientFlowStartFromMesAction extends RequestAbs {
 		UserDao userDao = (UserDao) cxt.getBean("userDao");
 		GroupXUserDao groupXUserDao = (GroupXUserDao) cxt.getBean("groupXUserDao");
 		ContractPurchaseService contractPurchaseService = (ContractPurchaseService) cxt.getBean("contractPurchaseService");
+		ContractEntryService contractEntryService = (ContractEntryService) cxt.getBean("contractEntryService");
+		CompanyRegisterService companyRegisterService  = (CompanyRegisterService) cxt.getBean("companyRegisterService");
+
 		User user = userDao.loadUserByUserName(userName, unitId);
 		if(user != null){
 			try {
 				user.setGroupXUsers(userService.loadFollowGroupXuser(user.getUseId()));
 				GroupXUser gxuser = groupXUserDao.loadOwnGroupXuser(user.getUseId(), false);
+				CompanyModel company = companyRegisterService.loadCompanyById(user.getCompanyId());
 				//流程信息
 				Map<String, Object> result = flowService.toStart(modelId);
 
@@ -147,8 +154,10 @@ public class BpmClientFlowStartFromMesAction extends RequestAbs {
 					String department = gxuser.getGroupName();
 					String depid = groupid;
 					String applyDate = DateUtil.getCurrDate("yyyy-MM-dd");
+					String companyName = company != null ? company.getCompanyName() : "";
 
 					if("200001".equals(formId)){
+						//采购申请表单
 						ContractPurchaseForm contractPurchaseForm = new ContractPurchaseForm();
 						contractPurchaseForm.setInitiator(initiator);
 						contractPurchaseForm.setDepartment(department);
@@ -178,6 +187,57 @@ public class BpmClientFlowStartFromMesAction extends RequestAbs {
 							rv.setReturnMsg("表单提交失败!!");
 							return JSONObject.fromObject(rv, config).toString();
 						}
+					}else if("200002".equals(formId)){
+						//合同申请表单
+						ContractInfo contractInfo = new ContractInfo();
+						contractInfo.setInitiator(initiator);
+						contractInfo.setDepartment(department);
+						contractInfo.setDepid(depid);
+						contractInfo.setApplyDate(applyDate);
+
+						contractInfo.setUniversalid(Long.valueOf(formInsId));
+						contractInfo.setlFormInsId(Long.valueOf(formInsId));
+						contractInfo.setIsValid(9);
+						contractInfo.setCreateTime(new Date());
+						contractInfo.setCreator(user.getUseId());
+						contractInfo.setUnit_id(Long.valueOf(unitId));
+
+						// 设置合同基本信息
+						//contractInfo.setContract_number(formInfo.optString("purchaseCode", null));
+						String contract_num = codeRuleService.createCode("CONTRACT_CODE", Long.valueOf(unitId), // 公司单位ID
+								null, // 特殊前缀值,没有传null
+								true, // 更新数据库流水号值
+								null);
+						contractInfo.setContract_number(contract_num);
+						contractInfo.setContract_name(formInfo.optString("contractName", contract_num));
+						contractInfo.setContract_type( formInfo.optLong("contractType", 2));//1销售、2采购
+						contractInfo.setSupplierCode(formInfo.optString("vendorCode", null));
+						contractInfo.setSupplierName(formInfo.optString("vendorName", null));
+						contractInfo.setSecondparty_name(formInfo.optString("vendorName", null));
+						contractInfo.setFirstparty_name(companyName);
+						contractInfo.setContract_entrying_operator(user.getUseId());
+						contractInfo.setContract_entrying_date(new Date());
+						contractInfo.setSalesman(user.getUseId());
+						contractInfo.setOrderNumber(formInfo.optString("orderNumber", null));
+						contractInfo.setRelation_ids("");
+						// 设置合同金额(税后总价)
+						if(formInfo.has("totalAmount")) {
+							contractInfo.setContract_money(BigDecimal.valueOf(formInfo.optDouble("totalAmount", 0.0)));
+						}
+						
+						// 映射物料明细列表
+						JSONArray lineItems = formInfo.optJSONArray("contractMaterialList");
+						if (lineItems != null && !lineItems.isEmpty()) {
+							contractInfo.setContractMaterialList(convertContractMaterials(lineItems));
+						}
+						
+						int i = 0;
+						i = contractEntryService.addContractEntry(contractInfo, null);
+						if (i < 0) {
+							rv.setReturnCode("-1");
+							rv.setReturnMsg("合同表单提交失败!!");
+							return JSONObject.fromObject(rv, config).toString();
+						}
 					}
 
 				} else {
@@ -280,8 +340,61 @@ public class BpmClientFlowStartFromMesAction extends RequestAbs {
 
 				pr = bpmCoreService.start(finstance, tinstance, nextTinstanceList, fileList, noticeUsers, task, "");
 
+				flowMap = new HashMap<String, Object>();
+				// 获取流转过程详情
+				List<TacheInstance> tacheList = flowService.getListOfTacheInstanceForProcess(insId);
+				List<Map<String, Object>> processList = new ArrayList<Map<String, Object>>();
+				
+				for (TacheInstance tacheInstance : tacheList) {
+					Map<String, Object> map = new HashMap<String, Object>();
+					map.put("tmodelName", tacheInstance.getTmodelId().getTmodelName());
+					map.put("name", tacheInstance.getUser().getUsername());
+					map.put("remark", tacheInstance.getRemark());
+					map.put("createdate", tacheInstance.getCreatedate());
+					map.put("finishdate", tacheInstance.getFinishdate());
+					map.put("dataName", tacheInstance.getState().getDataName());
+					map.put("tmodelId", tacheInstance.getTmodelId().getTmodelId());
+					map.put("state", tacheInstance.getState().getValue());
+					map.put("groupName", tacheInstance.getGroupxuserid().getGroupId().getGroupName());
+					map.put("positionName", tacheInstance.getGroupxuserid().getPositionId().getPositionName());
+					map.put("processType", tacheInstance.getProcess_type());
+					processList.add(map);
+				}
+				
+				// 获取自定义流程表单数据
+				if("200001".equals(formId)){
+					//采购申请表单
+					ContractPurchaseForm contractPurchaseForm = new ContractPurchaseForm();
+					contractPurchaseForm.setlFormInsId(Long.valueOf(formInsId));
+					contractPurchaseForm = contractPurchaseService.getContractPurchaseForm(contractPurchaseForm);
+					ContractPurchaseDetail contractPurchaseDetail = new ContractPurchaseDetail();
+					contractPurchaseDetail.setlFormInsId(Long.valueOf(formInsId));
+					@SuppressWarnings("unchecked")
+					List<ContractPurchaseDetail> contractPurchaseDetailList = (List<ContractPurchaseDetail>) (List<?>) contractPurchaseService.getObjectList(contractPurchaseDetail);
+					contractPurchaseForm.setDetails(contractPurchaseDetailList);
+					flowMap.put("contractPurchaseForm", contractPurchaseForm);
+				}else if("200002".equals(formId)){
+					//合同申请表单
+					ContractInfo contractInfo = new ContractInfo();
+					contractInfo.setUniversalid(Long.valueOf(formInsId));
+					contractInfo = (ContractInfo) contractEntryService.getObject(contractInfo);
+					List<ContractMaterial> contractMaterialList = contractEntryService.getContractMaterialListByContractId(contractInfo.getUniversalid());
+					List<ContractPayment> contractPaymentList = contractEntryService.getContractPaymentListByContractId(contractInfo.getUniversalid());
+					contractInfo.setContractMaterialList(contractMaterialList);
+					contractInfo.setContractPaymentList(contractPaymentList);
+					flowMap.put("contractInfo", contractInfo);
+				}
+				
+				// 组装返回数据
+				flowMap.put("insId", insId);
+				flowMap.put("insName", finstance.getInsName());
+				flowMap.put("createdate", finstance.getCreatedate());
+				String flowStr = JsonUtil.getJson(flowMap, true);
+				String processListStr = JsonUtil.getJson(processList, true);
+				
 				rv.setReturnCode("1");
 				rv.setReturnMsg("success");
+				rv.setReturnParams("{\"flow\":" + flowStr + ",\"processList\":" + processListStr + "}");
 				return JSONObject.fromObject(rv, config).toString();
 			} catch (Exception e) {
 				e.printStackTrace();
@@ -319,9 +432,45 @@ public class BpmClientFlowStartFromMesAction extends RequestAbs {
         return details;
     }
 
+    private List<ContractMaterial> convertContractMaterials(JSONArray lineItems) {
+        List<ContractMaterial> materials = new ArrayList<>();
+        for (int i = 0; i < lineItems.size(); i++) {
+            JSONObject lineJson = lineItems.getJSONObject(i);
+            ContractMaterial material = new ContractMaterial();
+            // 映射合同物料字段
+            material.setItemCode(lineJson.optString("itemCode", null));
+            material.setItemName(lineJson.optString("itemName", null));
+            material.setSpecification(lineJson.optString("specification", null));
+            material.setMeasureName(lineJson.optString("measureName", null));
+            material.setQty(BigDecimal.valueOf(lineJson.optDouble("quantity", 0.0)));
+            material.setPrice(BigDecimal.valueOf(lineJson.optDouble("price", 0.0)));
+            material.setCess(BigDecimal.valueOf(lineJson.optDouble("cess", 0.0)));
+            material.setPriceTax(BigDecimal.valueOf(lineJson.optDouble("priceTax", 0.0)));
+            materials.add(material);
+        }
+        return materials;
+    }
+
     public static void main(String[] args) throws Exception {
-		String url = "http://localhost:8080/ynet/clientServices.do?iscrypt=1";
-		String param = "{\"serviceId\":\"contract_purchaseUpdate\"," + "\"params\":{\"purchaseNumber\":\"CG20250711002\",\"purchaseStatus\":\"2\"}}";
+		String url = "http://localhost:8180/ynet/clientServices.do?iscrypt=1";
+		// 测试从MES采购订单发起合同申请
+		String param = "{\"serviceId\":\"bpm_FlowStartFromMes\",\"params\":{" +
+				"\"userName\":\"ceshi0\"," +
+				"\"unitId\":\"405015400328302\"," +
+				"\"modelId\":\"200002\"," +
+				"\"formInfo\":{" +
+					"\"orderNumber\":\"PO20250101002\"," + 
+					"\"contractName\":\"测试合同\"," +
+					"\"contractType\":2," + //1销售、2采购
+					"\"vendorCode\":\"GYS00008\"," +
+					"\"vendorName\":\"宜春市祥恒矿业有限公司\"," +
+					"\"totalAmount\":10000.00," +
+					"\"contractMaterialList\":[" +
+						"{\"itemCode\":\"M001\",\"itemName\":\"物料1\",\"specification\":\"规格1\",\"measureName\":\"个\",\"quantity\":10,\"price\":500.00,\"cess\":13.00,\"priceTax\":565.00}," +
+						"{\"itemCode\":\"M002\",\"itemName\":\"物料2\",\"specification\":\"规格2\",\"measureName\":\"件\",\"quantity\":5,\"price\":800.00,\"cess\":13.00,\"priceTax\":904.00}" +
+					"]" +
+				"}" +
+			"}}";
 		String rs = RegisterCodeImpl.requestPage(url, param);
 		System.out.println(rs);
 	}

+ 211 - 0
src/main/contract/com/yw/contract/client/action/PurchaseOrderCreateAction.java

@@ -0,0 +1,211 @@
+package com.yw.contract.client.action;
+
+import com.yw.contract.contract.model.ContractPurchaseOrder;
+import com.yw.contract.contract.model.ContractPurchaseOrderDetail;
+import com.yw.contract.contract.service.ContractPurchaseOrderService;
+import com.yw.core.clientImpl.model.ResultVo;
+import com.yw.core.clientImpl.service.RequestAbs;
+import com.yw.core.session.AppSession;
+import com.yw.core.utils.RegisterCodeImpl;
+import com.yw.core.utils.StringUtil;
+import com.yw.eu.base.user.dao.UserDao;
+import com.yw.eu.base.user.model.User;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import org.springframework.context.ApplicationContext;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 从MES采购单同步创建OA采购订单
+ */
+public class PurchaseOrderCreateAction extends RequestAbs {
+    public final String serviceId = "contract_mesPurchaseOrderCreate";
+    private ApplicationContext cxt = null;
+
+    @Override
+    public String getResult() {
+        // 获取请求的参数
+        String param = getParameters();
+        JSONObject json = JSONObject.fromObject(param);
+
+        if (null == cxt) {
+            cxt = AppSession.getApplicationContext();
+        }
+
+        ResultVo rv = null;
+
+        try {
+            // 获取用户和单位信息(必传参数)
+            String userName = json.getString("userName");
+            String unitId = json.getString("unitId");
+            
+            // 查询用户信息
+            UserDao userDao = (UserDao) cxt.getBean("userDao");
+            User user = userDao.loadUserByUserName(userName, unitId);
+            if (user == null) {
+                rv = new ResultVo();
+                rv.setReturnCode("-1");
+                rv.setReturnMsg("用户" + userName + "不存在或单位ID错误");
+                return JSONObject.fromObject(rv, config).toString();
+            }
+
+            // 解析MES采购单数据
+            String purchaseCode = json.getString("purchaseCode"); // MES采购单编号
+            String purchaseName = json.optString("purchaseName", ""); // MES采购单名称
+            String vendorCode = json.optString("vendorCode", ""); // 供应商编码
+            String vendorName = json.optString("vendorName", ""); // 供应商名称
+             String contractNumber = json.optString("contractNumber", ""); // 合同号
+            BigDecimal totalAmount = json.has("totalAmount") ? new BigDecimal(json.getString("totalAmount")) : BigDecimal.ZERO; // 税后总价
+
+            // 解析物料明细列表
+            JSONArray detailArray = json.getJSONArray("wmItemPurchaseLineList");
+            if (detailArray == null || detailArray.isEmpty()) {
+                rv = new ResultVo();
+                rv.setReturnCode("-1");
+                rv.setReturnMsg("物料明细不能为空");
+                return JSONObject.fromObject(rv, config).toString();
+            }
+
+            ContractPurchaseOrderService contractPurchaseOrderService = 
+                (ContractPurchaseOrderService) cxt.getBean("contractPurchaseOrderService");
+
+            // 检查是否已存在该MES采购单编号的订单
+            ContractPurchaseOrder existOrder = new ContractPurchaseOrder();
+            existOrder.setOrderNumber(purchaseCode);
+            Object existObj = contractPurchaseOrderService.getObject(existOrder);
+            if (existObj != null) {
+                rv = new ResultVo();
+                rv.setReturnCode("-1");
+                rv.setReturnMsg("采购订单" + purchaseCode + "已存在,请勿重复创建");
+                return JSONObject.fromObject(rv, config).toString();
+            }
+
+            // 创建OA采购订单主表
+            ContractPurchaseOrder contractPurchaseOrder = new ContractPurchaseOrder();
+            Long universalid = StringUtil.getSeq();
+            contractPurchaseOrder.setUniversalid(universalid);
+            contractPurchaseOrder.setOrderNumber(purchaseCode); // 使用MES采购单编号
+            contractPurchaseOrder.setOrderName(StringUtil.isEmpty(purchaseName) ? purchaseCode : purchaseName);
+            contractPurchaseOrder.setSupplierCode(vendorCode);
+            contractPurchaseOrder.setSupplierName(vendorName);
+            contractPurchaseOrder.setContractNumber(contractNumber);
+            contractPurchaseOrder.setTotalAmount(totalAmount);
+            contractPurchaseOrder.setOrderStatus(1); //订单状态,0未开始,1进行中,2已完成,3已取消
+            contractPurchaseOrder.setSyncStatus(1); //同步状态,0未同步,1MES同步,2金蝶云同步,3全部同步
+            contractPurchaseOrder.setSource(0); // 0无来源
+            contractPurchaseOrder.setCreator(user.getUseId()); // 使用真实用户ID
+            contractPurchaseOrder.setCreateTime(new Date());
+            contractPurchaseOrder.setUnitId(user.getUnitId()); // 使用真实单位ID
+
+            // 创建物料明细列表
+            List<ContractPurchaseOrderDetail> detailList = new ArrayList<>();
+            for (int i = 0; i < detailArray.size(); i++) {
+                JSONObject detailJson = detailArray.getJSONObject(i);
+
+                ContractPurchaseOrderDetail detail = new ContractPurchaseOrderDetail();
+                detail.setUniversalid(StringUtil.getSeq());
+                detail.setOrderId(universalid);
+                detail.setOrderNumber(purchaseCode);
+
+                // 物料信息
+                detail.setMaterialCode(detailJson.optString("itemCode", "")); // 物料编码
+                detail.setMaterialName(detailJson.optString("itemName", "")); // 物料名称
+                detail.setMaterialModel(detailJson.optString("specification", "")); // 规格型号
+                detail.setMeasureName(detailJson.optString("measureName", "")); // 单位名称
+
+                // 数量和价格
+                detail.setQty(detailJson.has("quantity") ? new BigDecimal(detailJson.getString("quantity")) : BigDecimal.ZERO); // 采购数量
+                detail.setPrice(detailJson.has("price") ? new BigDecimal(detailJson.getString("price")) : BigDecimal.ZERO); // 税前单价
+                detail.setCess(detailJson.has("cess") ? new BigDecimal(detailJson.getString("cess")) : BigDecimal.ZERO); // 税率
+                detail.setPriceTax(detailJson.has("priceTax") ? new BigDecimal(detailJson.getString("priceTax")) : BigDecimal.ZERO); // 税后单价
+                detail.setCreateTime(new Date());
+                detail.setUnitId(user.getUnitId()); // 使用真实单位ID
+
+                detailList.add(detail);
+            }
+
+            contractPurchaseOrder.setPurchaseOrderDetails(detailList);
+
+            // 调用Service保存采购订单
+            int num = contractPurchaseOrderService.addContractPurchaseOrder(contractPurchaseOrder);
+
+            if (num > 0) {
+                rv = new ResultVo();
+                rv.setReturnCode("1");
+                rv.setReturnMsg("success");
+                rv.setReturnParams("{\"orderId\":" + universalid + ",\"orderNumber\":\"" + purchaseCode + "\"}");
+            } else {
+                rv = new ResultVo();
+                rv.setReturnCode("-1");
+                rv.setReturnMsg("创建采购订单失败,错误码:" + num);
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            rv = new ResultVo();
+            rv.setReturnCode("-1");
+            rv.setReturnMsg("创建采购订单异常:" + e.getMessage());
+        }
+
+        return JSONObject.fromObject(rv, config).toString();
+    }
+
+    @Override
+    public String getServiceId() {
+        return serviceId;
+    }
+
+    public static void main(String[] args) throws Exception {
+        // 测试用例
+        String url = "http://localhost:8180/ynet/clientServices.do?iscrypt=1";
+        
+        // 构造测试数据
+        JSONObject testData = new JSONObject();
+        testData.put("serviceId", "contract_mesPurchaseOrderCreate");
+        
+        JSONObject params = new JSONObject();
+        params.put("userName", "ceshi0"); // MES操作用户名
+        params.put("unitId", "405015400328302"); // 单位ID
+        params.put("purchaseCode", "MES-CG-20260417001");
+        params.put("purchaseName", "MES测试采购单1");
+        params.put("vendorCode", "GYS00008");
+        params.put("vendorName", "宜春市祥恒矿业有限公司");
+        params.put("contractNumber", "HT20260417001");
+        params.put("totalAmount", "10000.00");
+        
+        // 物料明细
+        JSONArray detailList = new JSONArray();
+        JSONObject detail1 = new JSONObject();
+        detail1.put("itemCode", "M001");
+        detail1.put("itemName", "测试物料1");
+        detail1.put("specification", "规格1");
+        detail1.put("measureName", "个");
+        detail1.put("quantity", "100");
+        detail1.put("price", "50.00");
+        detail1.put("cess", "13.00");
+        detail1.put("priceTax", "56.50");
+        detailList.add(detail1);
+        
+        JSONObject detail2 = new JSONObject();
+        detail2.put("itemCode", "M002");
+        detail2.put("itemName", "测试物料2");
+        detail2.put("specification", "规格2");
+        detail2.put("measureName", "件");
+        detail2.put("quantity", "50");
+        detail2.put("price", "100.00");
+        detail2.put("cess", "13.00");
+        detail2.put("priceTax", "113.00");
+        detailList.add(detail2);
+        
+        params.put("wmItemPurchaseLineList", detailList);
+        
+        testData.put("params", params);
+        
+        String rs = RegisterCodeImpl.requestPage(url, testData.toString());
+        System.out.println(rs);
+    }
+}

+ 117 - 0
src/main/contract/com/yw/contract/client/action/PurchaseOrderQueryAction.java

@@ -0,0 +1,117 @@
+package com.yw.contract.client.action;
+
+import com.yw.contract.contract.model.ContractPurchaseOrder;
+import com.yw.contract.contract.model.ContractPurchaseOrderDetail;
+import com.yw.contract.contract.service.ContractPurchaseOrderService;
+import com.yw.core.clientImpl.model.ResultVo;
+import com.yw.core.clientImpl.service.RequestAbs;
+import com.yw.core.session.AppSession;
+import com.yw.core.utils.RegisterCodeImpl;
+import com.yw.core.utils.StringUtil;
+import net.sf.json.JSONObject;
+import org.springframework.context.ApplicationContext;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 从MES根据采购订单号查询OA采购订单信息
+ */
+public class PurchaseOrderQueryAction extends RequestAbs {
+    public final String serviceId = "contract_mesPurchaseOrderQuery";
+    private ApplicationContext cxt = null;
+
+    @Override
+    public String getResult() {
+        // 获取请求的参数
+        String param = getParameters();
+        JSONObject json = JSONObject.fromObject(param);
+
+        if (null == cxt) {
+            cxt = AppSession.getApplicationContext();
+        }
+
+        ResultVo rv = null;
+
+        try {
+            // 获取采购订单编号(必传参数)
+            String purchaseCode = json.getString("purchaseCode");
+            
+            if (StringUtil.isEmpty(purchaseCode)) {
+                rv = new ResultVo();
+                rv.setReturnCode("-1");
+                rv.setReturnMsg("采购订单编号不能为空");
+                return JSONObject.fromObject(rv, config).toString();
+            }
+
+            ContractPurchaseOrderService contractPurchaseOrderService = 
+                (ContractPurchaseOrderService) cxt.getBean("contractPurchaseOrderService");
+
+            // 查询采购订单主表
+            ContractPurchaseOrder queryOrder = new ContractPurchaseOrder();
+            queryOrder.setOrderNumber(purchaseCode);
+            Object orderObj = contractPurchaseOrderService.getObject(queryOrder);
+            
+            if (orderObj == null) {
+                rv = new ResultVo();
+                rv.setReturnCode("-1");
+                rv.setReturnMsg("采购订单" + purchaseCode + "不存在");
+                return JSONObject.fromObject(rv, config).toString();
+            }
+
+            ContractPurchaseOrder order = (ContractPurchaseOrder) orderObj;
+
+            // 查询采购订单明细
+            ContractPurchaseOrderDetail queryDetail = new ContractPurchaseOrderDetail();
+            queryDetail.setOrderId(order.getUniversalid());
+            List<Object> detailObjList = contractPurchaseOrderService.getObjectList(queryDetail);
+            
+            List<ContractPurchaseOrderDetail> detailList = new ArrayList<>();
+            if (detailObjList != null && !detailObjList.isEmpty()) {
+                for (Object obj : detailObjList) {
+                    detailList.add((ContractPurchaseOrderDetail) obj);
+                }
+            }
+
+            // 构建返回数据
+            JSONObject resultData = new JSONObject();
+            resultData.put("order", order);
+            resultData.put("detailList", detailList);
+
+            rv = new ResultVo();
+            rv.setReturnCode("1");
+            rv.setReturnMsg("success");
+            rv.setReturnParams(resultData.toString());
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            rv = new ResultVo();
+            rv.setReturnCode("-1");
+            rv.setReturnMsg("查询采购订单异常:" + e.getMessage());
+        }
+
+        return JSONObject.fromObject(rv, config).toString();
+    }
+
+    @Override
+    public String getServiceId() {
+        return serviceId;
+    }
+
+    public static void main(String[] args) throws Exception {
+        // 测试用例
+        String url = "http://localhost:8180/ynet/clientServices.do?iscrypt=1";
+        
+        // 构造测试数据
+        JSONObject testData = new JSONObject();
+        testData.put("serviceId", "contract_mesPurchaseOrderQuery");
+        
+        JSONObject params = new JSONObject();
+        params.put("purchaseCode", "MES-CG-20260417002");
+        
+        testData.put("params", params);
+        
+        String rs = RegisterCodeImpl.requestPage(url, testData.toString());
+        System.out.println(rs);
+    }
+}