Browse Source

委外变更

git-svn-id: svn+ssh://10.10.101.21/source/platform/platform-b2b@1287 f3bf4e98-0cf0-11e4-a00c-a99a8b9d557d
suntg 10 years ago
parent
commit
8dd02d74cc
35 changed files with 2061 additions and 9 deletions
  1. 71 0
      src/main/java/com/uas/platform/b2b/controller/MakeOrderChangeController.java
  2. 23 0
      src/main/java/com/uas/platform/b2b/dao/MakeOrderChangeDao.java
  3. 18 0
      src/main/java/com/uas/platform/b2b/dao/MakeOrderChangeIndexDao.java
  4. 20 0
      src/main/java/com/uas/platform/b2b/dao/MakeOrderChangeItemDao.java
  5. 4 1
      src/main/java/com/uas/platform/b2b/dao/MakeOrderReplyDao.java
  6. 84 0
      src/main/java/com/uas/platform/b2b/erp/controller/MakeChangeController.java
  7. 62 0
      src/main/java/com/uas/platform/b2b/erp/controller/OutsourceChangeController.java
  8. 44 1
      src/main/java/com/uas/platform/b2b/erp/controller/OutsourceController.java
  9. 1 0
      src/main/java/com/uas/platform/b2b/erp/model/Make.java
  10. 121 0
      src/main/java/com/uas/platform/b2b/erp/model/MakeChange.java
  11. 132 0
      src/main/java/com/uas/platform/b2b/erp/model/MakeChangeDetail.java
  12. 113 0
      src/main/java/com/uas/platform/b2b/erp/model/MakeChangeReply.java
  13. 19 0
      src/main/java/com/uas/platform/b2b/erp/model/SaleDownChange.java
  14. 17 0
      src/main/java/com/uas/platform/b2b/erp/model/SaleDownChangeDetail.java
  15. 29 0
      src/main/java/com/uas/platform/b2b/erp/model/SaleReply.java
  16. 26 0
      src/main/java/com/uas/platform/b2b/erp/service/MakeChangeService.java
  17. 18 0
      src/main/java/com/uas/platform/b2b/erp/service/OutsourceChangeService.java
  18. 18 0
      src/main/java/com/uas/platform/b2b/erp/service/OutsourceService.java
  19. 72 0
      src/main/java/com/uas/platform/b2b/erp/service/impl/MakeChangeServiceImpl.java
  20. 2 1
      src/main/java/com/uas/platform/b2b/erp/service/impl/MakeServiceImpl.java
  21. 28 0
      src/main/java/com/uas/platform/b2b/erp/service/impl/OutsourceChangeServiceImpl.java
  22. 31 0
      src/main/java/com/uas/platform/b2b/erp/service/impl/OutsourceServiceImpl.java
  23. 66 0
      src/main/java/com/uas/platform/b2b/event/MakeOrderChangeSaveEvent.java
  24. 8 0
      src/main/java/com/uas/platform/b2b/listener/KeywordListener.java
  25. 1 1
      src/main/java/com/uas/platform/b2b/manage/controller/EnterpriseController.java
  26. 198 0
      src/main/java/com/uas/platform/b2b/model/MakeOrderChange.java
  27. 105 0
      src/main/java/com/uas/platform/b2b/model/MakeOrderChangeIndex.java
  28. 440 0
      src/main/java/com/uas/platform/b2b/model/MakeOrderChangeItem.java
  29. 1 1
      src/main/java/com/uas/platform/b2b/model/MakeOrderIndex.java
  30. 1 1
      src/main/java/com/uas/platform/b2b/model/MakeOrderReply.java
  31. 15 0
      src/main/java/com/uas/platform/b2b/model/PurchaseOrderAllItem.java
  32. 66 0
      src/main/java/com/uas/platform/b2b/service/MakeOrderChangeService.java
  33. 179 0
      src/main/java/com/uas/platform/b2b/service/impl/MakeOrderChangeServiceImpl.java
  34. 9 2
      src/main/java/com/uas/platform/b2b/service/impl/MakeOrderServiceImpl.java
  35. 19 1
      src/main/java/com/uas/platform/b2b/service/impl/PurchaseOrderServiceImpl.java

+ 71 - 0
src/main/java/com/uas/platform/b2b/controller/MakeOrderChangeController.java

@@ -0,0 +1,71 @@
+package com.uas.platform.b2b.controller;
+
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.uas.platform.b2b.model.MakeOrderChangeItem;
+import com.uas.platform.b2b.service.MakeOrderChangeService;
+import com.uas.platform.b2b.support.SystemSession;
+import com.uas.platform.b2b.support.UsageBufferedLogger;
+import com.uas.platform.core.logging.BufferedLoggerManager;
+import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
+import com.uas.platform.core.util.serializer.FlexJsonUtils;
+
+/**
+ * 委外加工变更处理
+ * @author suntg
+ * @since 2015年8月10日上午10:28:41
+ */
+@Controller
+@RequestMapping("/make/changes")
+public class MakeOrderChangeController {
+
+	@Autowired
+	private MakeOrderChangeService makeOrderChangeService;
+
+	private final static UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
+
+	/**
+	 * 作为卖家,收到的委外变更单(全部)
+	 * 
+	 * @param json
+	 * @return
+	 */
+	@RequestMapping(method = RequestMethod.GET)
+	@ResponseBody
+	public Page<MakeOrderChangeItem> getReceivedPurchaseOrderChanges(PageParams params, String keyword) {
+		logger.log("客户委外变更单", "查看收到的客户委外变更单列表(全部)");
+		PageInfo info = new PageInfo(params);
+		// 我作为卖家,把我的企业ID作为供应商ID传入
+		info.filter("vendUU", SystemSession.getUser().getEnterprise().getUu());
+		return makeOrderChangeService.findAllByPageInfo(info, keyword);
+	}
+
+	/**
+	 * 作为卖家,回复收到的委外变更单<br>
+	 * 处理接口保留,因流程变更不再使用(2015年8月11日10:39:49)
+	 * 
+	 * @param json
+	 * @param changeId
+	 * @return
+	 */
+	@RequestMapping(value = "/{itemId}/reply", method = RequestMethod.POST)
+	public ResponseEntity<String> replyOrderItem(@RequestBody String json, @PathVariable("itemId") Long itemId) {
+		MakeOrderChangeItem item = FlexJsonUtils.fromJson(json, MakeOrderChangeItem.class);
+		item = makeOrderChangeService.reply(item);
+		logger.log("客户委外变更单", "给单个客户委外变更单填写回复信息并确认回复", item.replyDescription(), item.getOrderCode(), itemId);
+		return new ResponseEntity<String>(HttpStatus.OK);
+	}
+
+
+}

+ 23 - 0
src/main/java/com/uas/platform/b2b/dao/MakeOrderChangeDao.java

@@ -0,0 +1,23 @@
+package com.uas.platform.b2b.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import com.uas.platform.b2b.model.MakeOrderChange;
+
+@Repository
+public interface MakeOrderChangeDao extends JpaSpecificationExecutor<MakeOrderChange>, JpaRepository<MakeOrderChange, Long> {
+
+	/**
+	 * 按所属企业及编号查找变更单
+	 * 
+	 * @param enUU
+	 * @param code
+	 * @return
+	 */
+	public List<MakeOrderChange> findByEnUUAndCode(Long enUU, String code);
+
+}

+ 18 - 0
src/main/java/com/uas/platform/b2b/dao/MakeOrderChangeIndexDao.java

@@ -0,0 +1,18 @@
+package com.uas.platform.b2b.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import com.uas.platform.b2b.model.MakeOrderChangeIndex;
+
+@Repository
+public interface MakeOrderChangeIndexDao extends JpaRepository<MakeOrderChangeIndex, Long> {
+
+	@Query("select i.key from MakeOrderChangeIndex i where i.enUU = :enUU and i.keyword = :keyword")
+	List<Long> findByKeyword(@Param("enUU") long enUU, @Param("keyword") String keyword);
+
+}

+ 20 - 0
src/main/java/com/uas/platform/b2b/dao/MakeOrderChangeItemDao.java

@@ -0,0 +1,20 @@
+package com.uas.platform.b2b.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import com.uas.platform.b2b.model.MakeOrderChangeItem;
+
+@Repository
+public interface MakeOrderChangeItemDao extends JpaSpecificationExecutor<MakeOrderChangeItem>,
+		JpaRepository<MakeOrderChangeItem, Long> {
+	
+	public List<MakeOrderChangeItem> findByOrderChangeEnUUAndStatusAndReplySendStatus(Long enUU, 
+			Short status, Short replySendStatus);
+	
+	public List<MakeOrderChangeItem> findByVendUUAndSendStatus(Long vendUU, Short sendStatus);
+
+}

+ 4 - 1
src/main/java/com/uas/platform/b2b/dao/MakeOrderReplyDao.java

@@ -4,6 +4,8 @@ import java.util.List;
 
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
 import com.uas.platform.b2b.model.MakeOrderReply;
@@ -17,7 +19,8 @@ public interface MakeOrderReplyDao extends JpaSpecificationExecutor<MakeOrderRep
 	 * @param orderItemId
 	 * @return
 	 */
-	public List<MakeOrderReply> findByOrderId(Long orderId);
+	@Query("select r from MakeOrderReply r where r.orderId = :orderId order by r.date desc")
+	public List<MakeOrderReply> findByOrderId(@Param("orderId") Long orderId);
 
 	/**
 	 * (买家)按回复记录的状态查找回复记录

+ 84 - 0
src/main/java/com/uas/platform/b2b/erp/controller/MakeChangeController.java

@@ -0,0 +1,84 @@
+package com.uas.platform.b2b.erp.controller;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.uas.platform.b2b.erp.model.MakeChange;
+import com.uas.platform.b2b.erp.model.MakeChangeReply;
+import com.uas.platform.b2b.erp.service.MakeChangeService;
+import com.uas.platform.b2b.erp.support.ErpBufferedLogger;
+import com.uas.platform.b2b.service.MakeOrderChangeService;
+import com.uas.platform.core.logging.BufferedLoggerManager;
+import com.uas.platform.core.util.serializer.FlexJsonUtils;
+
+/**
+ * 对买家ERP的数据接口<br>
+ * 买家委外加工单变更单处理
+ * 
+ * @author suntg
+ * @since 2015年8月7日10:35:50
+ */
+@Controller
+@RequestMapping("/erp/make/change")
+public class MakeChangeController {
+
+	@Autowired
+	private MakeChangeService makeChangeService;
+
+	@Autowired
+	private MakeOrderChangeService makeOrderChangeService;
+
+	private final static ErpBufferedLogger logger = BufferedLoggerManager.getLogger(ErpBufferedLogger.class);
+
+	/**
+	 * 将ERP的委外加工变更单写到平台
+	 * 
+	 * @param data
+	 * @return
+	 * @throws UnsupportedEncodingException
+	 */
+	@RequestMapping(method = RequestMethod.POST)
+	@ResponseBody
+	public void savePurchases(@RequestParam("data") String data) throws UnsupportedEncodingException {
+		String jsonStr = URLDecoder.decode(data, "UTF-8");
+		List<MakeChange> changes = FlexJsonUtils.fromJsonArray(jsonStr, MakeChange.class);
+		makeOrderChangeService.save(makeChangeService.convertMakeChange(changes));
+		logger.log("委外加工变更单", "上传委外加工变更单", changes.size());
+	}
+
+	/**
+	 * 买家ERP从平台获取委外变更单的回复信息
+	 * 
+	 * @return
+	 */
+	@RequestMapping(value = "/reply", method = RequestMethod.GET)
+	@ResponseBody
+	public List<MakeChangeReply> getReply() {
+		List<MakeChangeReply> replies = makeChangeService.convertMakeOrderChangeReply(
+				makeOrderChangeService.findNotUploadReply());
+		logger.log("委外变更单", "下载委外变更单回复信息", replies.size());
+		return replies;
+	}
+
+	/**
+	 * 平台的委外变更单回复信息传到ERP之后,修改平台里面的变更单的回复传输状态为【已下载】
+	 * 
+	 * @return
+	 * @throws UnsupportedEncodingException
+	 */
+	@RequestMapping(value = "/reply", method = RequestMethod.POST)
+	@ResponseBody
+	public void onReplySuccess(@RequestParam("data") String data) throws UnsupportedEncodingException {
+		makeOrderChangeService.onReplyUploadSuccess(URLDecoder.decode(data, "UTF-8").split(","));
+	}
+
+
+}

+ 62 - 0
src/main/java/com/uas/platform/b2b/erp/controller/OutsourceChangeController.java

@@ -0,0 +1,62 @@
+package com.uas.platform.b2b.erp.controller;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.uas.platform.b2b.erp.model.SaleDownChange;
+import com.uas.platform.b2b.erp.service.OutsourceChangeService;
+import com.uas.platform.b2b.erp.support.ErpBufferedLogger;
+import com.uas.platform.b2b.service.MakeOrderChangeService;
+import com.uas.platform.core.logging.BufferedLoggerManager;
+
+/**
+ * 委外变更单,对卖方ERP接口
+ * @author suntg
+ * @since 2015年8月11日上午10:54:00
+ */
+@Controller
+@RequestMapping("/erp/outsource/change")
+public class OutsourceChangeController {
+
+	@Autowired
+	private MakeOrderChangeService makeOrderChangeService;
+
+	@Autowired
+	private OutsourceChangeService outsourceChangeService;
+	
+	private final static ErpBufferedLogger logger = BufferedLoggerManager.getLogger(ErpBufferedLogger.class);
+
+	/**
+	 * 卖家ERP从平台获取委外变更单
+	 * 
+	 * @return
+	 */
+	@RequestMapping(method = RequestMethod.GET)
+	@ResponseBody
+	public List<SaleDownChange> getOrderChanges() {
+		List<SaleDownChange> changes = outsourceChangeService.convertMakeOrderChange(makeOrderChangeService.findNotUpload());
+		logger.log("客户委外变更单", "下载客户委外变更单", changes.size());
+		return changes;
+	}
+ 
+	/**
+	 * 平台的委外变更单传到供应商ERP之后,修改平台里面的委外变更单的上传状态
+	 * 
+	 * @return
+	 * @throws UnsupportedEncodingException
+	 */
+	@RequestMapping(method = RequestMethod.POST)
+	@ResponseBody
+	public void onSaleDownChangeSuccess(@RequestParam("data") String data) throws UnsupportedEncodingException {
+		makeOrderChangeService.onUploadChangeSuccess(URLDecoder.decode(data, "UTF-8").split(","));
+	}
+
+}

+ 44 - 1
src/main/java/com/uas/platform/b2b/erp/controller/OutsourceController.java

@@ -12,10 +12,12 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import com.uas.platform.b2b.erp.model.SaleDown;
+import com.uas.platform.b2b.erp.model.SaleReply;
 import com.uas.platform.b2b.erp.service.OutsourceService;
 import com.uas.platform.b2b.erp.support.ErpBufferedLogger;
 import com.uas.platform.b2b.service.MakeOrderService;
 import com.uas.platform.core.logging.BufferedLoggerManager;
+import com.uas.platform.core.util.serializer.FlexJsonUtils;
 
 /**
  * 对卖家ERP的委外加工单数据接口
@@ -49,7 +51,7 @@ public class OutsourceController {
 	}
 
 	/**
-	 * 平台的订单传到供应商ERP之后,修改平台里面的订单的上传状态
+	 * 平台的委外订单传到供应商ERP之后,修改平台里面的订单的上传状态
 	 * 
 	 * @return
 	 * @throws UnsupportedEncodingException
@@ -60,5 +62,46 @@ public class OutsourceController {
 		makeOrderService.onMakeDownSuccess(URLDecoder.decode(data, "UTF-8").split(","));
 	}
 
+	/**
+	 * 将卖家ERP的委外订单回复写到平台
+	 * 
+	 * @param data
+	 * @return
+	 * @throws UnsupportedEncodingException
+	 */
+	@RequestMapping(value = "/reply", method = RequestMethod.POST)
+	@ResponseBody
+	public void saveReplies(@RequestParam("data") String data) throws UnsupportedEncodingException {
+		String jsonStr = URLDecoder.decode(data, "UTF-8");
+		List<SaleReply> replies = FlexJsonUtils.fromJsonArray(jsonStr, SaleReply.class);
+		makeOrderService.reply(outsourceService.convertSaleReply(replies));
+		logger.log("客户委外加工单", "上传客户委外加工单回复信息", replies.size());
+	}
+
+	/**
+	 * 卖家ERP从平台获取在平台回复的记录
+	 * 
+	 * @return
+	 */
+	@RequestMapping(value = "/reply", method = RequestMethod.GET)
+	@ResponseBody
+	public List<SaleReply> getReply() {
+		List<SaleReply> replies = outsourceService.convertMakeOrderReply(makeOrderService.findNotBackReply());
+		logger.log("客户委外加工单", "下载直接在平台回复的客户委外加工单回复信息", replies.size());
+		return replies;
+	}
+
+	/**
+	 * 平台的回复记录传到供应商ERP之后,修改平台里面的回复记录的上传状态
+	 * 
+	 * @return
+	 * @throws UnsupportedEncodingException
+	 */
+	@RequestMapping(value = "/reply/back", method = RequestMethod.POST)
+	@ResponseBody
+	public void onReplyDownSuccess(@RequestParam("data") String data) throws UnsupportedEncodingException {
+		makeOrderService.onReplyBackSuccess(URLDecoder.decode(data, "UTF-8").split(","));
+	}
+
 
 }

+ 1 - 0
src/main/java/com/uas/platform/b2b/erp/model/Make.java

@@ -235,6 +235,7 @@ public class Make{
 		make.setDelivery(ma_date);
 		make.setEnd(Constant.NO);
 		make.setEnUU(SystemSession.getUser().getEnterprise().getUu());
+		make.setEnterprise(SystemSession.getUser().getEnterprise());
 		make.setKind(ma_kind);
 		make.setMakeQty(ma_makeqty);
 		make.setPayments(ma_payments);

+ 121 - 0
src/main/java/com/uas/platform/b2b/erp/model/MakeChange.java

@@ -0,0 +1,121 @@
+package com.uas.platform.b2b.erp.model;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.springframework.util.CollectionUtils;
+
+import com.uas.platform.b2b.model.MakeOrderChange;
+import com.uas.platform.b2b.model.MakeOrderChangeItem;
+import com.uas.platform.b2b.support.SystemSession;
+
+public class MakeChange{
+
+	private Long mc_id;// id
+	private String mc_code;// 变更单号
+	private Date mc_indate;// 录入日期
+	private Date mc_date;// 日期
+	private String mc_recorder;// 录入人
+	private String mc_auditman;// 审核人
+	private Date mc_auditdate;// 审核日期
+	private String mc_remark;// 备注
+	private List<MakeChangeDetail> changeDetails;// 明细
+
+	@JsonIgnore
+	public Long getMc_id() {
+		return mc_id;
+	}
+
+	public void setMc_id(Long mc_id) {
+		this.mc_id = mc_id;
+	}
+
+	public String getMc_code() {
+		return mc_code;
+	}
+
+	public void setMc_code(String mc_code) {
+		this.mc_code = mc_code;
+	}
+
+	public Date getMc_indate() {
+		return mc_indate;
+	}
+
+	public void setMc_indate(Date mc_indate) {
+		this.mc_indate = mc_indate;
+	}
+
+	public Date getMc_date() {
+		return mc_date;
+	}
+
+	public void setMc_date(Date mc_date) {
+		this.mc_date = mc_date;
+	}
+
+	public String getMc_recorder() {
+		return mc_recorder;
+	}
+
+	public void setMc_recorder(String mc_recorder) {
+		this.mc_recorder = mc_recorder;
+	}
+
+	public String getMc_auditman() {
+		return mc_auditman;
+	}
+
+	public void setMc_auditman(String mc_auditman) {
+		this.mc_auditman = mc_auditman;
+	}
+
+	public Date getMc_auditdate() {
+		return mc_auditdate;
+	}
+
+	public void setMc_auditdate(Date mc_auditdate) {
+		this.mc_auditdate = mc_auditdate;
+	}
+
+	public String getMc_remark() {
+		return mc_remark;
+	}
+
+	public void setMc_remark(String mc_remark) {
+		this.mc_remark = mc_remark;
+	}
+
+	public List<MakeChangeDetail> getChangeDetails() {
+		return changeDetails;
+	}
+
+	public void setChangeDetails(List<MakeChangeDetail> changeDetails) {
+		this.changeDetails = changeDetails;
+	}
+	
+	public MakeOrderChange convert() {
+		MakeOrderChange change = new MakeOrderChange();
+		change.setCode(mc_code);
+		change.setDate(mc_indate);
+		change.setEnUU(SystemSession.getUser().getEnterprise().getUu());
+		change.setEnterprise(SystemSession.getUser().getEnterprise());
+		change.setRecorder(mc_recorder);
+		change.setRemark(mc_remark);
+		change.setUserUU(SystemSession.getUser().getUserUU());
+		change.setAuditDate(mc_auditdate);
+		change.setAuditMan(mc_auditman);
+		if(! CollectionUtils.isEmpty(changeDetails)) {
+			Set<MakeOrderChangeItem> changeItems = new HashSet<MakeOrderChangeItem>();
+			for(MakeChangeDetail changeDetail : changeDetails) {
+				changeItems.add(changeDetail.convert());
+			}
+			change.setOrderChangeItems(changeItems);
+		}
+		return change;
+	}
+
+}

+ 132 - 0
src/main/java/com/uas/platform/b2b/erp/model/MakeChangeDetail.java

@@ -0,0 +1,132 @@
+package com.uas.platform.b2b.erp.model;
+
+import java.util.Date;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+
+import com.uas.platform.b2b.model.MakeOrderChangeItem;
+import com.uas.platform.core.model.Status;
+
+public class MakeChangeDetail {
+
+	private Long md_id;// id
+	private Long md_mcid;// 主记录id
+	private Short md_detno;// 序号
+	private String md_makecode;// 委外加工单号
+	private Double md_oldqty;// 原需求数量
+	private Double md_newqty;// 新需求数量
+	private Double md_oldprice;// 原加工单价
+	private Double md_newprice;// 新加工单价
+	private Date md_planbegindate;// 原计划开工日期
+	private Date md_planenddate;// 原计划完工日期
+	private Date md_newplanbegindate;// 新计划开工日期
+	private Date md_newplanenddate;// 新计划完工日期
+	private String md_remark;// 备注
+	private String md_reason;// 变更原因
+	
+	@JsonIgnore
+	public Long getMd_id() {
+		return md_id;
+	}
+	public void setMd_id(Long md_id) {
+		this.md_id = md_id;
+	}
+	public Long getMd_mcid() {
+		return md_mcid;
+	}
+	public void setMd_mcid(Long md_mcid) {
+		this.md_mcid = md_mcid;
+	}
+	public Short getMd_detno() {
+		return md_detno;
+	}
+	public void setMd_detno(Short md_detno) {
+		this.md_detno = md_detno;
+	}
+	public String getMd_makecode() {
+		return md_makecode;
+	}
+	public void setMd_makecode(String md_makecode) {
+		this.md_makecode = md_makecode;
+	}
+	public Double getMd_oldqty() {
+		return md_oldqty;
+	}
+	public void setMd_oldqty(Double md_oldqty) {
+		this.md_oldqty = md_oldqty;
+	}
+	public Double getMd_newqty() {
+		return md_newqty;
+	}
+	public void setMd_newqty(Double md_newqty) {
+		this.md_newqty = md_newqty;
+	}
+	public Double getMd_oldprice() {
+		return md_oldprice;
+	}
+	public void setMd_oldprice(Double md_oldprice) {
+		this.md_oldprice = md_oldprice;
+	}
+	public Double getMd_newprice() {
+		return md_newprice;
+	}
+	public void setMd_newprice(Double md_newprice) {
+		this.md_newprice = md_newprice;
+	}
+	public Date getMd_planbegindate() {
+		return md_planbegindate;
+	}
+	public void setMd_planbegindate(Date md_planbegindate) {
+		this.md_planbegindate = md_planbegindate;
+	}
+	public Date getMd_planenddate() {
+		return md_planenddate;
+	}
+	public void setMd_planenddate(Date md_planenddate) {
+		this.md_planenddate = md_planenddate;
+	}
+	public Date getMd_newplanbegindate() {
+		return md_newplanbegindate;
+	}
+	public void setMd_newplanbegindate(Date md_newplanbegindate) {
+		this.md_newplanbegindate = md_newplanbegindate;
+	}
+	public Date getMd_newplanenddate() {
+		return md_newplanenddate;
+	}
+	public void setMd_newplanenddate(Date md_newplanenddate) {
+		this.md_newplanenddate = md_newplanenddate;
+	}
+	public String getMd_remark() {
+		return md_remark;
+	}
+	public void setMd_remark(String md_remark) {
+		this.md_remark = md_remark;
+	}
+	public String getMd_reason() {
+		return md_reason;
+	}
+	public void setMd_reason(String md_reason) {
+		this.md_reason = md_reason;
+	}
+	
+	public MakeOrderChangeItem convert() {
+		MakeOrderChangeItem item = new MakeOrderChangeItem();
+		item.setNewCommence(md_newplanbegindate);
+		item.setNewComplete(md_newplanenddate);
+		item.setNewPrice(md_newprice);
+		item.setNewQty(md_newqty);
+		item.setNumber(md_detno);
+		item.setOldCommence(md_planbegindate);
+		item.setOldComplete(md_planenddate);
+		item.setOldPrice(md_oldprice);
+		item.setOldQty(md_oldqty);
+		item.setOrderCode(md_makecode);
+		item.setRemark(md_remark);
+		item.setReason(md_reason);
+		item.setStatus((short) Status.NOT_REPLY.value());
+		item.setSendStatus((short) Status.NOT_UPLOAD.value());
+		return item;
+	}
+
+}

+ 113 - 0
src/main/java/com/uas/platform/b2b/erp/model/MakeChangeReply.java

@@ -0,0 +1,113 @@
+package com.uas.platform.b2b.erp.model;
+
+import java.util.Date;
+
+import com.uas.platform.b2b.model.MakeOrderChangeItem;
+
+public class MakeChangeReply {
+
+	private long b2b_md_id;
+	/**
+	 * 供应商是否同意了我的变更请求(1,0)
+	 */
+	private Short md_agreed;
+	/**
+	 * 供应商的回复备注
+	 */
+	private String md_replyremark;
+	/**
+	 * 回复时间
+	 */
+	private Date md_replydate;
+	/**
+	 * 回复人
+	 */
+	private String md_replyman;
+	private String mc_code;
+	private Short md_detno;
+	private String ma_code;
+	
+	public long getB2b_md_id() {
+		return b2b_md_id;
+	}
+
+	public void setB2b_md_id(long b2b_md_id) {
+		this.b2b_md_id = b2b_md_id;
+	}
+
+	public Short getMd_agreed() {
+		return md_agreed;
+	}
+
+	public void setMd_agreed(Short md_agreed) {
+		this.md_agreed = md_agreed;
+	}
+
+	public String getMd_replyremark() {
+		return md_replyremark;
+	}
+
+	public void setMd_replyremark(String md_replyremark) {
+		this.md_replyremark = md_replyremark;
+	}
+
+	public Date getMd_replydate() {
+		return md_replydate;
+	}
+
+	public void setMd_replydate(Date md_replydate) {
+		this.md_replydate = md_replydate;
+	}
+
+	public String getMd_replyman() {
+		return md_replyman;
+	}
+
+	public void setMd_replyman(String md_replyman) {
+		this.md_replyman = md_replyman;
+	}
+
+	public String getMc_code() {
+		return mc_code;
+	}
+
+	public void setMc_code(String mc_code) {
+		this.mc_code = mc_code;
+	}
+
+	public Short getMd_detno() {
+		return md_detno;
+	}
+
+	public void setMd_detno(Short md_detno) {
+		this.md_detno = md_detno;
+	}
+
+	public String getMa_code() {
+		return ma_code;
+	}
+
+	public void setMa_code(String ma_code) {
+		this.ma_code = ma_code;
+	}
+
+	public MakeChangeReply(){
+		
+	}
+	
+	/**
+	 * 已回复的委外变更明细转化为买方ERP上的回复信息
+	 * @param changeItem
+	 */
+	public MakeChangeReply(MakeOrderChangeItem changeItem) {
+		this.b2b_md_id = changeItem.getId();
+		this.md_agreed = changeItem.getAgreed();
+		this.mc_code = changeItem.getOrderChange().getCode();
+		this.md_replydate = changeItem.getReplyDate();
+		this.md_replyremark = changeItem.getReplyRemark();
+		this.md_replyman = changeItem.getReplyMan();
+		this.md_detno = changeItem.getNumber();
+		this.ma_code = changeItem.getOrderCode();
+	}
+
+}

+ 19 - 0
src/main/java/com/uas/platform/b2b/erp/model/SaleDownChange.java

@@ -6,6 +6,7 @@ import java.util.List;
 
 import org.springframework.util.CollectionUtils;
 
+import com.uas.platform.b2b.model.MakeOrderChangeItem;
 import com.uas.platform.b2b.model.PurchaseOrderChange;
 import com.uas.platform.b2b.model.PurchaseOrderChangeItem;
 
@@ -165,5 +166,23 @@ public class SaleDownChange {
 			this.changeDetails = details;
 		}
 	}
+	
+	/**
+	 * 委外变更单 -> 卖方ERP的采购变更单
+	 * @param item
+	 */
+	public SaleDownChange(MakeOrderChangeItem item) {
+		this.b2b_pc_id = item.getId();
+		this.sc_agreed = 1;
+		this.sc_code = item.getOrderChange().getCode();
+		this.sc_sacode = item.getOrderCode();
+		this.sc_custuu = item.getOrderChange().getEnUU();
+		this.sc_indate = item.getOrderChange().getDate();
+		this.sc_remark = item.getOrderChange().getRemark();
+		this.sc_recorder = item.getOrderChange().getRecorder();
+		List<SaleDownChangeDetail> details = new ArrayList<SaleDownChangeDetail>();
+		details.add(new SaleDownChangeDetail(item));
+		this.changeDetails = details;
+	}
 
 }

+ 17 - 0
src/main/java/com/uas/platform/b2b/erp/model/SaleDownChangeDetail.java

@@ -2,6 +2,7 @@ package com.uas.platform.b2b.erp.model;
 
 import java.util.Date;
 
+import com.uas.platform.b2b.model.MakeOrderChangeItem;
 import com.uas.platform.b2b.model.PurchaseOrderChangeItem;
 
 /**
@@ -127,5 +128,21 @@ public class SaleDownChangeDetail {
 		this.scd_newtaxrate = changeItem.getNewTaxrate();
 		this.scd_sddetno = changeItem.getOrderItemNumber();
 	}
+	
+	/**
+	 * 委外变更单明细 -> 采购变更明细
+	 * @param item
+	 */
+	public SaleDownChangeDetail(MakeOrderChangeItem item) {
+		this.scd_detno = 1;
+		this.scd_newcustprodcode = item.getProduct().getCode();
+		this.scd_newcustproddetail = item.getProduct().getTitle();
+		this.scd_newcustprodspec = item.getProduct().getSpec();
+		this.scd_newcustprodunit = item.getProduct().getUnit();
+		this.scd_newprice = item.getNewPrice();
+		this.scd_newqty = item.getNewQty();
+		this.scd_remark = item.getRemark();
+		this.scd_sddetno = 1;
+	}
 
 }

+ 29 - 0
src/main/java/com/uas/platform/b2b/erp/model/SaleReply.java

@@ -2,6 +2,7 @@ package com.uas.platform.b2b.erp.model;
 
 import java.util.Date;
 
+import com.uas.platform.b2b.model.MakeOrderReply;
 import com.uas.platform.b2b.model.PurchaseOrderReply;
 import com.uas.platform.core.model.Status;
 
@@ -129,6 +130,22 @@ public class SaleReply {
 		return reply;
 	}
 
+	/**
+	 * 从卖家ERP的委外订单回复记录转到平台的委外加工单回复记录
+	 */
+	public MakeOrderReply convertToMakeReply() {
+		MakeOrderReply reply = new MakeOrderReply();
+		reply.setDate(this.sr_date);
+		reply.setDelivery(this.sr_delivery);
+		reply.setQty(this.sr_qty);
+		reply.setRecorder(this.sr_recorder);
+		reply.setRemark(this.sr_remark);
+		reply.setBackStatus((short) Status.DOWNLOADED.value());// 写回到卖方ERP的状态
+		reply.setSendStatus((short) Status.NOT_UPLOAD.value());// 传输到买方ERP的状态
+		reply.setType("供应商ERP回复");
+		return reply;
+	}
+
 	public SaleReply() {
 	}
 
@@ -150,4 +167,16 @@ public class SaleReply {
 		this.sr_type = reply.getType();
 	}
 
+	public SaleReply(MakeOrderReply reply) {
+		this.sr_date = reply.getDate();
+		this.sr_delivery = reply.getDelivery();
+		this.sr_qty = reply.getQty();
+		this.sr_recorder = reply.getRecorder();
+		this.sr_remark = reply.getRemark();
+		this.sr_sacode = reply.getOrder().getCode();
+		this.sr_sddetno = 1;
+		this.b2b_pd_id = reply.getOrderId();
+		this.b2b_pr_id = reply.getId();
+		this.sr_type = reply.getType();
+	}
 }

+ 26 - 0
src/main/java/com/uas/platform/b2b/erp/service/MakeChangeService.java

@@ -0,0 +1,26 @@
+package com.uas.platform.b2b.erp.service;
+
+import java.util.List;
+
+import com.uas.platform.b2b.erp.model.MakeChange;
+import com.uas.platform.b2b.erp.model.MakeChangeReply;
+import com.uas.platform.b2b.model.MakeOrderChangeItem;
+
+public interface MakeChangeService {
+
+	/**
+	 * 将ERP系统的委外加工单变更单,转为平台的委外变更单
+	 * 
+	 * @param changes
+	 * @return
+	 */
+	List<MakeOrderChangeItem> convertMakeChange(List<MakeChange> changes);
+	
+	/**
+	 * 将平台上的委外变更单回复信息转为买方ERP的委外变更回复信息
+	 * @param items
+	 * @return
+	 */
+	List<MakeChangeReply> convertMakeOrderChangeReply(List<MakeOrderChangeItem> items);
+
+}

+ 18 - 0
src/main/java/com/uas/platform/b2b/erp/service/OutsourceChangeService.java

@@ -0,0 +1,18 @@
+package com.uas.platform.b2b.erp.service;
+
+import java.util.List;
+
+import com.uas.platform.b2b.erp.model.SaleDownChange;
+import com.uas.platform.b2b.model.MakeOrderChangeItem;
+
+public interface OutsourceChangeService {
+
+	/**
+	 * 将平台里面的委外变更单,转为供应商ERP的客户采购变更单
+	 * 
+	 * @param orderChanges
+	 * @return
+	 */
+	List<SaleDownChange> convertMakeOrderChange(List<MakeOrderChangeItem> items);
+
+}

+ 18 - 0
src/main/java/com/uas/platform/b2b/erp/service/OutsourceService.java

@@ -3,7 +3,9 @@ package com.uas.platform.b2b.erp.service;
 import java.util.List;
 
 import com.uas.platform.b2b.erp.model.SaleDown;
+import com.uas.platform.b2b.erp.model.SaleReply;
 import com.uas.platform.b2b.model.MakeOrder;
+import com.uas.platform.b2b.model.MakeOrderReply;
 
 public interface OutsourceService {
 
@@ -15,4 +17,20 @@ public interface OutsourceService {
 	 */
 	List<SaleDown> convertMakeOrder(List<MakeOrder> orders);
 
+	/**
+	 * 将供应商在ERP的委外订单回复,转为平台委外加工单的回复
+	 * 
+	 * @param replies
+	 * @return
+	 */
+	List<MakeOrderReply> convertSaleReply(List<SaleReply> replies);
+
+	/**
+	 * 将供应商在ERP的委外订单回复,转为平台委外加工单的回复
+	 * 
+	 * @param replies
+	 * @return
+	 */
+	List<SaleReply> convertMakeOrderReply(List<MakeOrderReply> replies);
+
 }

+ 72 - 0
src/main/java/com/uas/platform/b2b/erp/service/impl/MakeChangeServiceImpl.java

@@ -0,0 +1,72 @@
+package com.uas.platform.b2b.erp.service.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import com.uas.platform.b2b.dao.MakeOrderChangeDao;
+import com.uas.platform.b2b.dao.MakeOrderDao;
+import com.uas.platform.b2b.erp.model.MakeChange;
+import com.uas.platform.b2b.erp.model.MakeChangeReply;
+import com.uas.platform.b2b.erp.service.MakeChangeService;
+import com.uas.platform.b2b.model.MakeOrder;
+import com.uas.platform.b2b.model.MakeOrderChange;
+import com.uas.platform.b2b.model.MakeOrderChangeItem;
+import com.uas.platform.b2b.support.SystemSession;
+
+@Service
+public class MakeChangeServiceImpl implements MakeChangeService {
+
+	@Autowired
+	private MakeOrderChangeDao makeOrderChangeDao;
+
+	@Autowired
+	private MakeOrderDao makeOrderDao;
+
+	@Override
+	public List<MakeOrderChangeItem> convertMakeChange(List<MakeChange> changes) {
+		List<MakeOrderChangeItem> changeItems = new ArrayList<MakeOrderChangeItem>();
+		long enUU = SystemSession.getUser().getEnterprise().getUu();
+		if(!CollectionUtils.isEmpty(changes)) {
+			for (MakeChange change : changes) {
+				MakeOrderChange orderChange = change.convert();
+				List<MakeOrderChange> existOrderChanges = makeOrderChangeDao.findByEnUUAndCode(enUU, change.getMc_code());
+				// 平台上已存在变更单时不保存
+				if(CollectionUtils.isEmpty(existOrderChanges) && !CollectionUtils.isEmpty(orderChange.getOrderChangeItems())) {
+					for(MakeOrderChangeItem changeItem : orderChange.getOrderChangeItems()) {
+						List<MakeOrder> makeOrders = makeOrderDao.findByEnUUAndCode(enUU, changeItem.getOrderCode());
+						if(makeOrders.size() > 0) {
+							MakeOrder makeOrder = makeOrders.get(0);
+							changeItem.setOrderId(makeOrder.getId());
+							changeItem.setProduct(makeOrder.getProduct());
+							changeItem.setProductId(makeOrder.getProductId());
+							changeItem.setVendUU(makeOrder.getVendUU());
+							changeItem.setVendUserUU(makeOrder.getUserUU());
+							changeItem.setOrderChange(orderChange);
+							changeItems.add(changeItem);
+						}
+					}
+				}
+			}
+		}
+		return changeItems;
+	}
+
+	@Override
+	public List<MakeChangeReply> convertMakeOrderChangeReply(
+			List<MakeOrderChangeItem> items) {
+		List<MakeChangeReply> replies = new ArrayList<MakeChangeReply>();
+		if( ! CollectionUtils.isEmpty(items)) {
+			for(MakeOrderChangeItem item : items) {
+				replies.add(new MakeChangeReply(item));
+			}
+		}
+		return replies;
+	}
+
+
+
+}

+ 2 - 1
src/main/java/com/uas/platform/b2b/erp/service/impl/MakeServiceImpl.java

@@ -96,8 +96,9 @@ public class MakeServiceImpl implements MakeService{
 	public List<MakeReply> convertMakeOrderReply(List<MakeOrderReply> replies) {
 		List<MakeReply> makeReplies = new ArrayList<MakeReply>();
 		if(!CollectionUtils.isEmpty(replies)) {
-			for(MakeOrderReply reply : replies) 
+			for(MakeOrderReply reply : replies) {
 				makeReplies.add(new MakeReply(reply));
+			}
 		}
 		return makeReplies;
 	}

+ 28 - 0
src/main/java/com/uas/platform/b2b/erp/service/impl/OutsourceChangeServiceImpl.java

@@ -0,0 +1,28 @@
+package com.uas.platform.b2b.erp.service.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import com.uas.platform.b2b.erp.model.SaleDownChange;
+import com.uas.platform.b2b.erp.service.OutsourceChangeService;
+import com.uas.platform.b2b.model.MakeOrderChangeItem;
+
+@Service
+public class OutsourceChangeServiceImpl implements OutsourceChangeService {
+
+	@Override
+	public List<SaleDownChange> convertMakeOrderChange(
+			List<MakeOrderChangeItem> items) {
+		List<SaleDownChange> changes = new ArrayList<SaleDownChange>();
+		if(! CollectionUtils.isEmpty(items)) {
+			for(MakeOrderChangeItem item : items) {
+				changes.add(new SaleDownChange(item));
+			}
+		}
+		return changes;
+	}
+
+}

+ 31 - 0
src/main/java/com/uas/platform/b2b/erp/service/impl/OutsourceServiceImpl.java

@@ -3,14 +3,22 @@ package com.uas.platform.b2b.erp.service.impl;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
+import com.uas.platform.b2b.dao.MakeOrderDao;
 import com.uas.platform.b2b.erp.model.SaleDown;
+import com.uas.platform.b2b.erp.model.SaleReply;
 import com.uas.platform.b2b.erp.service.OutsourceService;
 import com.uas.platform.b2b.model.MakeOrder;
+import com.uas.platform.b2b.model.MakeOrderReply;
 
 @Service
 public class OutsourceServiceImpl implements OutsourceService {
+	
+	@Autowired
+	private MakeOrderDao makeOrderDao;
 
 	@Override
 	public List<SaleDown> convertMakeOrder(List<MakeOrder> orders) {
@@ -20,5 +28,28 @@ public class OutsourceServiceImpl implements OutsourceService {
 		return sales;
 	}
 
+	@Override
+	public List<MakeOrderReply> convertSaleReply(List<SaleReply> replies) {
+		List<MakeOrderReply> orderReplies = new ArrayList<MakeOrderReply>();
+		for (SaleReply reply : replies) {
+			List<MakeOrder> orders = makeOrderDao.findByEnUUAndCode(reply.getCu_uu(), reply.getSr_sacode());
+			if (!CollectionUtils.isEmpty(orders)) {
+				MakeOrderReply orderReply = reply.convertToMakeReply();
+				orderReply.setOrderId(orders.get(0).getId());
+				orderReplies.add(orderReply);
+			}
+		}
+		return orderReplies;
+	}
+
+	@Override
+	public List<SaleReply> convertMakeOrderReply(List<MakeOrderReply> replies) {
+		List<SaleReply> saleReplies = new ArrayList<SaleReply>();
+		for (MakeOrderReply reply : replies) {
+			saleReplies.add(new SaleReply(reply));
+		}
+		return saleReplies;
+	}
+
 
 }

+ 66 - 0
src/main/java/com/uas/platform/b2b/event/MakeOrderChangeSaveEvent.java

@@ -0,0 +1,66 @@
+package com.uas.platform.b2b.event;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.uas.platform.b2b.core.util.SearchKeyUtils;
+import com.uas.platform.b2b.model.MakeOrderChangeIndex;
+import com.uas.platform.b2b.model.MakeOrderChangeItem;
+import com.uas.platform.b2b.support.XingePusher;
+
+/**
+ * 客户委外加工单保存事件
+ * @author suntg
+ * @since 2015年8月7日下午2:51:20
+ */
+public class MakeOrderChangeSaveEvent extends SaveEvent<MakeOrderChangeIndex, MakeOrderChangeItem> {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	public MakeOrderChangeSaveEvent(List<MakeOrderChangeItem> savedList) {
+		super(savedList);
+	}
+
+	@Override
+	public List<MakeOrderChangeIndex> split(MakeOrderChangeItem saved) {
+		long key = saved.getId();
+		long enUU = saved.getVendUU();
+		List<MakeOrderChangeIndex> indexes = new ArrayList<MakeOrderChangeIndex>();
+		// 委外单号(匹配完整的编号)
+		indexes.add(new MakeOrderChangeIndex(enUU, key, saved.getOrderCode()));
+		// 委外变更单号(匹配完整的编号)
+		indexes.add(new MakeOrderChangeIndex(enUU, key, saved.getOrderChange().getCode()));
+		// 客户名称(匹配两个字以上的客户名称关键字)
+		indexes.addAll(MakeOrderChangeIndex.format(enUU, key,
+				SearchKeyUtils.splitToKeys(saved.getOrderChange().getEnterprise().getEnName(), false)));
+		// 客户UU号(匹配完整的UU号)
+		indexes.add(new MakeOrderChangeIndex(enUU, key, saved.getOrderChange().getEnUU().toString()));
+		// 物料
+		indexes.add(new MakeOrderChangeIndex(enUU, key, saved.getProduct().getCode()));
+		indexes.addAll(MakeOrderChangeIndex.format(enUU, key,
+				SearchKeyUtils.splitToKeys(saved.getProduct().getTitle(), false)));
+		indexes.addAll(MakeOrderChangeIndex.format(enUU, key,
+				SearchKeyUtils.splitToKeys(saved.getProduct().getSpec(), false)));
+		return indexes;
+	}
+
+	@Override
+	public void pusher(List<MakeOrderChangeItem> savedList) {
+		// 将采购单信息推送通知供应商联系人UU号
+		for (MakeOrderChangeItem order : savedList) {
+			if (order.getVendUserUU() != null) {
+				// Android
+				XingePusher.pushSingleAccountAndroid(order.getVendUserUU().toString(), "客户委外加工单变更",
+						"客户:" + order.getOrderChange().getEnterprise().getEnName(),
+						"");
+				// IOS
+				XingePusher.pushSingleAccountIOS(order.getVendUserUU().toString(),
+						"客户委外加工单变更-" + "客户:" + order.getOrderChange().getEnterprise().getEnName());
+			}
+		}
+	}
+
+}

+ 8 - 0
src/main/java/com/uas/platform/b2b/listener/KeywordListener.java

@@ -7,6 +7,7 @@ import org.springframework.context.ApplicationListener;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 
+import com.uas.platform.b2b.dao.MakeOrderChangeIndexDao;
 import com.uas.platform.b2b.dao.MakeOrderIndexDao;
 import com.uas.platform.b2b.dao.ProductIndexDao;
 import com.uas.platform.b2b.dao.PurchaseAcceptIndexDao;
@@ -24,6 +25,7 @@ import com.uas.platform.b2b.dao.PurchaseProofingItemIndexDao;
 import com.uas.platform.b2b.dao.PurchaseReturnIndexDao;
 import com.uas.platform.b2b.dao.SaleQuotationItemIndexDao;
 import com.uas.platform.b2b.dao.SaleSendIndexDao;
+import com.uas.platform.b2b.event.MakeOrderChangeSaveEvent;
 import com.uas.platform.b2b.event.MakeOrderSaveEvent;
 import com.uas.platform.b2b.event.ProductSaveEvent;
 import com.uas.platform.b2b.event.PurchaseAcceptSaveEvent;
@@ -42,6 +44,7 @@ import com.uas.platform.b2b.event.PurchaseReturnSaveEvent;
 import com.uas.platform.b2b.event.SaleQuotationSaveEvent;
 import com.uas.platform.b2b.event.SaleSendSaveEvent;
 import com.uas.platform.b2b.event.SaveEvent;
+import com.uas.platform.b2b.model.MakeOrderChangeIndex;
 import com.uas.platform.b2b.model.MakeOrderIndex;
 import com.uas.platform.b2b.model.ProductIndex;
 import com.uas.platform.b2b.model.PurchaseAcceptIndex;
@@ -120,6 +123,9 @@ public class KeywordListener implements ApplicationListener<SaveEvent<?, ?>> {
 
 	@Autowired
 	private MakeOrderIndexDao makeOrderIndexDao;
+	
+	@Autowired
+	private MakeOrderChangeIndexDao makeOrderChangeIndexDao;
 
 	@SuppressWarnings("unchecked")
 	@Async
@@ -159,6 +165,8 @@ public class KeywordListener implements ApplicationListener<SaveEvent<?, ?>> {
 			purchaseProofingApprovalIndexDao.save((List<PurchaseProofingApprovalIndex>) event.split());
 		} else if (event instanceof MakeOrderSaveEvent) {
 			makeOrderIndexDao.save((List<MakeOrderIndex>) event.split());
+		} else if (event instanceof MakeOrderChangeSaveEvent) {
+			makeOrderChangeIndexDao.save((List<MakeOrderChangeIndex>) event.split());
 		}
 	}
 

+ 1 - 1
src/main/java/com/uas/platform/b2b/manage/controller/EnterpriseController.java

@@ -44,7 +44,7 @@ public class EnterpriseController {
 	/**
 	 * 管理平台项目地址
 	 */
-	public static final String MANAGE_HOST = "http://192.168.253.231:9090/platform-manage/";
+	public static final String MANAGE_HOST = "http://218.17.158.219:9090/platform-manage/";
 	
 	/**
 	 *管理平台获取需要审核的企业

+ 198 - 0
src/main/java/com/uas/platform/b2b/model/MakeOrderChange.java

@@ -0,0 +1,198 @@
+package com.uas.platform.b2b.model;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+import javax.persistence.OrderBy;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import org.codehaus.jackson.annotate.JsonIgnore;
+
+/**
+ * 委外变更单(主表,变更信息在明细表)
+ * @author suntg
+ * @since 2015年8月6日下午2:18:11
+ */
+@Table(name = "make$changes")
+@Entity
+public class MakeOrderChange implements Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "make$changes_gen")
+	@SequenceGenerator(name = "make$changes_gen", sequenceName = "make$changes_seq", allocationSize = 1)
+	@Column(name = "mc_id")
+	private Long id;
+
+	/**
+	 * 采购变更单所属企业UU
+	 */
+	@Column(name = "mc_enuu")
+	private Long enUU;
+
+	/**
+	 * 采购企业
+	 */
+	@OneToOne(cascade = { CascadeType.REFRESH })
+	@JoinColumn(name = "mc_enuu", insertable = false, updatable = false)
+	private Enterprise enterprise;
+
+	/**
+	 * 变更单买方用户UU(订单中的数据)
+	 */
+	@Column(name = "mc_useruu")
+	private Long userUU;
+
+	/**
+	 * 采购变更单号
+	 */
+	@Column(name = "mc_code")
+	private String code;
+
+	/**
+	 * 录入人
+	 */
+	@Column(name = "mc_recorder")
+	private String recorder;
+
+	/**
+	 * 单据录入日期
+	 */
+	@Column(name = "mc_indate")
+	private Date date;
+	
+	/**
+	 * 审核人
+	 */
+	@Column(name = "mc_auditman")
+	private String auditMan;
+	
+	/**
+	 * 审核日期
+	 */
+	@Column(name = "mc_auditdate")
+	private Date auditDate;
+
+	/**
+	 * 备注
+	 */
+	@Column(name = "mc_remark")
+	private String remark;
+
+	/**
+	 * 采购变更单明细
+	 */
+	@OneToMany(mappedBy = "orderChange", cascade = { CascadeType.REFRESH, CascadeType.PERSIST, CascadeType.REMOVE,
+			CascadeType.MERGE }, fetch = FetchType.EAGER)
+	@OrderBy("number")
+	private Set<MakeOrderChangeItem> orderChangeItems;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Long getEnUU() {
+		return enUU;
+	}
+
+	public void setEnUU(Long enUU) {
+		this.enUU = enUU;
+	}
+
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public String getRecorder() {
+		return recorder;
+	}
+
+	public void setRecorder(String recorder) {
+		this.recorder = recorder;
+	}
+
+	public Date getDate() {
+		return date;
+	}
+
+	public void setDate(Date date) {
+		this.date = date;
+	}
+
+	public String getRemark() {
+		return remark;
+	}
+
+	public void setRemark(String remark) {
+		this.remark = remark;
+	}
+
+	@JsonIgnore
+	@JSONField(serialize = false)
+	public Set<MakeOrderChangeItem> getOrderChangeItems() {
+		return orderChangeItems;
+	}
+
+	public void setOrderChangeItems(Set<MakeOrderChangeItem> orderChangeItems) {
+		this.orderChangeItems = orderChangeItems;
+	}
+
+	public Enterprise getEnterprise() {
+		return enterprise;
+	}
+
+	public void setEnterprise(Enterprise enterprise) {
+		this.enterprise = enterprise;
+	}
+
+	public Long getUserUU() {
+		return userUU;
+	}
+
+	public void setUserUU(Long userUU) {
+		this.userUU = userUU;
+	}
+
+	public String getAuditMan() {
+		return auditMan;
+	}
+
+	public void setAuditMan(String auditMan) {
+		this.auditMan = auditMan;
+	}
+
+	public Date getAuditDate() {
+		return auditDate;
+	}
+
+	public void setAuditDate(Date auditDate) {
+		this.auditDate = auditDate;
+	}
+
+
+}

+ 105 - 0
src/main/java/com/uas/platform/b2b/model/MakeOrderChangeIndex.java

@@ -0,0 +1,105 @@
+package com.uas.platform.b2b.model;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Index;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+
+import org.springframework.util.CollectionUtils;
+
+/**
+ * 客户委外变更单关键词库
+ * 
+ * @author suntg
+ * @since 2015年8月7日14:50:22
+ * 
+ */
+@Table(name = "make$changes$index", indexes = { @Index(name = "make$changes$index_keyword", columnList = "index_enuu,index_word") })
+@Entity
+public class MakeOrderChangeIndex {
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "make$changes$index_gen")
+	@SequenceGenerator(name = "make$changes$index_gen", sequenceName = "make$changes$index_seq", allocationSize = 1)
+	@Column(name = "index_id")
+	private Long id;
+
+	/**
+	 * 所属企业UU
+	 */
+	@Column(name = "index_enuu")
+	private Long enUU;
+
+	/**
+	 * 采购单ID
+	 */
+	@Column(name = "index_key")
+	private Long key;
+
+	/**
+	 * 关键词
+	 */
+	@Column(name = "index_word")
+	private String keyword;
+
+	public MakeOrderChangeIndex() {
+	}
+
+	public MakeOrderChangeIndex(long enUU, long key, String keyword) {
+		this.enUU = enUU;
+		this.key = key;
+		this.keyword = keyword;
+	}
+
+	public static List<MakeOrderChangeIndex> format(long enUU, long key, Set<String> keywords) {
+		List<MakeOrderChangeIndex> indexes = new ArrayList<MakeOrderChangeIndex>();
+		if (!CollectionUtils.isEmpty(keywords)) {
+			for (String keyword : keywords) {
+				indexes.add(new MakeOrderChangeIndex(enUU, key, keyword));
+			}
+			
+		}
+		return indexes;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Long getEnUU() {
+		return enUU;
+	}
+
+	public void setEnUU(Long enUU) {
+		this.enUU = enUU;
+	}
+
+	public Long getKey() {
+		return key;
+	}
+
+	public void setKey(Long key) {
+		this.key = key;
+	}
+
+	public String getKeyword() {
+		return keyword;
+	}
+
+	public void setKeyword(String keyword) {
+		this.keyword = keyword;
+	}
+
+}

+ 440 - 0
src/main/java/com/uas/platform/b2b/model/MakeOrderChangeItem.java

@@ -0,0 +1,440 @@
+package com.uas.platform.b2b.model;
+
+import java.util.Date;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToOne;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.uas.platform.core.model.Constant;
+
+/**
+ * 委外变更单明细
+ * @author suntg
+ * @since 2015年8月6日下午2:57:52
+ */
+@Table(name = "make$changeitems")
+@Entity
+public class MakeOrderChangeItem {
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "make$changeitems_gen")
+	@SequenceGenerator(name = "make$changeitems_gen", sequenceName = "make$changeitems_seq", allocationSize = 1)
+	@Column(name = "mcd_id")
+	private Long id;
+
+	/**
+	 * 序号
+	 */
+	@Column(name = "mcd_number")
+	private Short number;
+	
+	/**
+	 * 变更单供应商UU
+	 */
+	@Column(name = "mcd_venduu")
+	private Long vendUU;
+
+	/**
+	 * 变更单卖方用户UU(订单中的数据)
+	 */
+	@Column(name = "mcd_venduseruu")
+	private Long vendUserUU;
+
+	/**
+	 * 采购订单变更单
+	 */
+	@ManyToOne(cascade = CascadeType.ALL, optional = true)
+	@JoinColumn(name = "mcd_pcid", nullable = false)
+	private MakeOrderChange orderChange;
+
+	/**
+	 * 委外加工单ID
+	 */
+	@Column(name = "mcd_maid")
+	private Long orderId;
+	
+	/**
+	 * 委外加工单编号
+	 */
+	@Column(name = "mcd_macode")
+	private String orderCode;
+	
+	/**
+	 * 生产的物料
+	 */
+	@OneToOne(cascade = { CascadeType.REFRESH })
+	@JoinColumn(name = "mcd_prid", insertable = false, updatable = false)
+	private Product product;
+
+	/**
+	 * 生产物料id
+	 */
+	@Column(name = "mcd_prid")
+	private Long productId;
+
+	/**
+	 * 新数量
+	 */
+	@Column(name = "mcd_newqty")
+	private Double newQty;
+
+	/**
+	 * 原数量
+	 */
+	@Column(name = "mcd_oldqty")
+	private Double oldQty;
+
+	/**
+	 * 新加工单价
+	 */
+	@Column(name = "mcd_newprice")
+	private Double newPrice;
+
+	/**
+	 * 原加工单价
+	 */
+	@Column(name = "mcd_oldprice")
+	private Double oldPrice;
+
+	/**
+	 * 新计划开工日期
+	 */
+	@Column(name = "mcd_newcommence")
+	private Date newCommence;
+
+	/**
+	 * 原计划开工日期
+	 */
+	@Column(name = "mcd_oldcommence")
+	private Date oldCommence;
+
+	/**
+	 * 新计划完工日期
+	 */
+	@Column(name = "mcd_newcomplete")
+	private Date newComplete;
+
+	/**
+	 * 原计划完工日期
+	 */
+	@Column(name = "mcd_oldcomplete")
+	private Date oldComplete;
+
+	/**
+	 * 备注
+	 */
+	@Column(name = "mcd_remark")
+	private String remark;
+	
+	/**
+	 * 变更原因
+	 */
+	@Column(name = "mcd_reason")
+	private String reason;
+	
+	/**
+	 * 变更单传到卖方ERP的状态
+	 */
+	@Column(name = "mcd_sendstatus")
+	private Short sendStatus;
+
+	/**
+	 * 状态(未回复、已回复)
+	 */
+	@Column(name = "mcd_status")
+	private Short status;
+
+	/**
+	 * 卖家是否同意了买家的变更请求(1,0)
+	 */
+	@Column(name = "mcd_agreed")
+	private Short agreed;
+	
+	/**
+	 * 不需要供应商确认(1,0)
+	 */
+	@Column(name = "mcd_unneedreply")
+	private Short unNeedReply;
+
+	/**
+	 * 回复备注
+	 */
+	@Column(name = "mcd_replyremark")
+	private String replyRemark;
+
+	/**
+	 * 回复人
+	 */
+	@Column(name = "mcd_replyman")
+	private String replyMan;
+	
+	/**
+	 * 回复时间
+	 */
+	@Column(name = "mcd_replydate")
+	private Date replyDate;
+
+	/**
+	 * 从平台上回复的内容回传到卖方ERP的状态
+	 */
+	@Column(name = "mcd_replybackstatus")
+	private Short replyBackStatus;
+
+	/**
+	 * 回复内容传到买方ERP的状态
+	 */
+	@Column(name = "mcd_replysendstatus")
+	private Short replySendStatus;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Short getNumber() {
+		return number;
+	}
+
+	public void setNumber(Short number) {
+		this.number = number;
+	}
+
+	public Double getNewQty() {
+		return newQty;
+	}
+
+	public void setNewQty(Double newQty) {
+		this.newQty = newQty;
+	}
+
+	public Double getNewPrice() {
+		return newPrice;
+	}
+
+	public void setNewPrice(Double newPrice) {
+		this.newPrice = newPrice;
+	}
+
+	public String getRemark() {
+		return remark;
+	}
+
+	public void setRemark(String remark) {
+		this.remark = remark;
+	}
+
+	public Double getOldQty() {
+		return oldQty;
+	}
+
+	public void setOldQty(Double oldQty) {
+		this.oldQty = oldQty;
+	}
+
+	public Double getOldPrice() {
+		return oldPrice;
+	}
+
+	public void setOldPrice(Double oldPrice) {
+		this.oldPrice = oldPrice;
+	}
+
+	public MakeOrderChange getOrderChange() {
+		return orderChange;
+	}
+
+	public void setOrderChange(MakeOrderChange orderChange) {
+		this.orderChange = orderChange;
+	}
+
+	public Long getOrderId() {
+		return orderId;
+	}
+
+	public void setOrderId(Long orderId) {
+		this.orderId = orderId;
+	}
+
+	public String getOrderCode() {
+		return orderCode;
+	}
+
+	public void setOrderCode(String orderCode) {
+		this.orderCode = orderCode;
+	}
+
+	public Product getProduct() {
+		return product;
+	}
+
+	public void setProduct(Product product) {
+		this.product = product;
+	}
+
+	public Date getNewCommence() {
+		return newCommence;
+	}
+
+	public void setNewCommence(Date newCommence) {
+		this.newCommence = newCommence;
+	}
+
+	public Date getOldCommence() {
+		return oldCommence;
+	}
+
+	public void setOldCommence(Date oldCommence) {
+		this.oldCommence = oldCommence;
+	}
+
+	public Date getNewComplete() {
+		return newComplete;
+	}
+
+	public void setNewComplete(Date newComplete) {
+		this.newComplete = newComplete;
+	}
+
+	public Date getOldComplete() {
+		return oldComplete;
+	}
+
+	public void setOldComplete(Date oldComplete) {
+		this.oldComplete = oldComplete;
+	}
+
+	public Short getSendStatus() {
+		return sendStatus;
+	}
+
+	public void setSendStatus(Short sendStatus) {
+		this.sendStatus = sendStatus;
+	}
+
+	public Short getStatus() {
+		return status;
+	}
+
+	public void setStatus(Short status) {
+		this.status = status;
+	}
+
+	public Short getAgreed() {
+		return agreed;
+	}
+
+	public void setAgreed(Short agreed) {
+		this.agreed = agreed;
+	}
+
+	public Short getUnNeedReply() {
+		return unNeedReply;
+	}
+
+	public void setUnNeedReply(Short unNeedReply) {
+		this.unNeedReply = unNeedReply;
+	}
+
+	public String getReplyRemark() {
+		return replyRemark;
+	}
+
+	public void setReplyRemark(String replyRemark) {
+		this.replyRemark = replyRemark;
+	}
+
+	public Short getReplyBackStatus() {
+		return replyBackStatus;
+	}
+
+	public void setReplyBackStatus(Short replyBackStatus) {
+		this.replyBackStatus = replyBackStatus;
+	}
+
+	public Short getReplySendStatus() {
+		return replySendStatus;
+	}
+
+	public void setReplySendStatus(Short replySendStatus) {
+		this.replySendStatus = replySendStatus;
+	}
+
+	public Long getVendUU() {
+		return vendUU;
+	}
+
+	public void setVendUU(Long vendUU) {
+		this.vendUU = vendUU;
+	}
+
+	public Long getVendUserUU() {
+		return vendUserUU;
+	}
+
+	public void setVendUserUU(Long vendUserUU) {
+		this.vendUserUU = vendUserUU;
+	}
+
+	public Long getProductId() {
+		return productId;
+	}
+
+	public void setProductId(Long productId) {
+		this.productId = productId;
+	}
+
+	public String getReason() {
+		return reason;
+	}
+
+	public void setReason(String reason) {
+		this.reason = reason;
+	}
+
+	public Date getReplyDate() {
+		return replyDate;
+	}
+
+	public void setReplyDate(Date replyDate) {
+		this.replyDate = replyDate;
+	}
+
+	public String getReplyMan() {
+		return replyMan;
+	}
+
+	public void setReplyMan(String replyMan) {
+		this.replyMan = replyMan;
+	}
+
+	@JsonIgnore
+	@JSONField(serialize = false)
+	public boolean isAgreed() {
+		return this.agreed != null && Constant.YES == this.agreed;
+	}
+
+	/**
+	 * 处理详情
+	 * 
+	 * @return
+	 */
+	public String replyDescription() {
+		return isAgreed() ? "同意变更" : "不同意变更";
+	}
+
+}

+ 1 - 1
src/main/java/com/uas/platform/b2b/model/MakeOrderIndex.java

@@ -16,7 +16,7 @@ import javax.persistence.Table;
 import org.springframework.util.CollectionUtils;
 
 /**
- * 客户委外变更单关键词库
+ * 客户委外加工单关键词库
  * 
  * @author suntg
  * 

+ 1 - 1
src/main/java/com/uas/platform/b2b/model/MakeOrderReply.java

@@ -46,7 +46,7 @@ public class MakeOrderReply implements Serializable {
 	 * 回复时日期
 	 */
 	@Column(name = "mr_date")
-	@OrderBy
+	@OrderBy("asc")
 	private Date date;
 
 	/**

+ 15 - 0
src/main/java/com/uas/platform/b2b/model/PurchaseOrderAllItem.java

@@ -17,6 +17,7 @@ import javax.persistence.ManyToOne;
 import javax.persistence.OneToOne;
 import javax.persistence.SequenceGenerator;
 import javax.persistence.Table;
+import javax.persistence.Transient;
 
 import org.codehaus.jackson.annotate.JsonIgnore;
 
@@ -147,6 +148,12 @@ public class PurchaseOrderAllItem {
 	 */
 	@Column(name = "pd_returnqty")
 	private Double returnQty;
+	
+	/**
+	 * 关键词查询相关
+	 */
+	@Transient
+	private Boolean key;
 
 	public Long getId() {
 		return id;
@@ -310,6 +317,14 @@ public class PurchaseOrderAllItem {
 		this.returnQty = returnQty;
 	}
 
+	public Boolean getKey() {
+		return key;
+	}
+
+	public void setKey(Boolean key) {
+		this.key = key;
+	}
+
 	public static List<PurchaseOrderAll> distinct(List<PurchaseOrderAllItem> items) {
 		List<PurchaseOrderAll> orders = new ArrayList<PurchaseOrderAll>();
 		Set<Long> keys = new HashSet<Long>();

+ 66 - 0
src/main/java/com/uas/platform/b2b/service/MakeOrderChangeService.java

@@ -0,0 +1,66 @@
+package com.uas.platform.b2b.service;
+
+import java.util.List;
+
+import org.springframework.data.domain.Page;
+
+import com.uas.platform.b2b.model.MakeOrderChangeItem;
+import com.uas.platform.core.model.PageInfo;
+
+public interface MakeOrderChangeService {
+
+	/**
+	 * 批量保存、修改采购委外加工单变更单
+	 * 
+	 * @param changeItems
+	 * @return
+	 * @author suntg
+	 * @since 2015年8月7日10:57:59
+	 */
+	public void save(List<MakeOrderChangeItem> changeItems);
+
+	/**
+	 * 分页变更单明细
+	 * 
+	 * @param pageInfo
+	 * @param keyword
+	 *            查找关键词
+	 * @return
+	 */
+	public Page<MakeOrderChangeItem> findAllByPageInfo(PageInfo pageInfo, String keyword);
+	
+
+	/**
+	 * 回复单个明细
+	 * 
+	 * @param reply
+	 */
+	public MakeOrderChangeItem reply(MakeOrderChangeItem change);
+	
+	/**
+	 * 获取未传输到买方ERP的回复信息
+	 * @return
+	 */
+	public List<MakeOrderChangeItem> findNotUploadReply();
+	
+	/**
+	 * 回复信息传输到买方ERP之后修改平台的变更单明细回复传输状态为已下载
+	 * @param idStr
+	 */
+	public void onReplyUploadSuccess(String[] idArray);
+
+	/**
+	 * 查找所有待上传到供应商ERP的委外变更单
+	 * 
+	 * @return
+	 */
+	public List<MakeOrderChangeItem> findNotUpload();
+
+	/**
+	 * 平台的委外变更单传到供应商ERP之后,修改平台里面的委外变更单的上传状态
+	 * 
+	 * @param idArray
+	 */
+	public void onUploadChangeSuccess(String[] idArray);
+
+}

+ 179 - 0
src/main/java/com/uas/platform/b2b/service/impl/MakeOrderChangeServiceImpl.java

@@ -0,0 +1,179 @@
+package com.uas.platform.b2b.service.impl;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import com.uas.platform.b2b.core.util.ContextUtils;
+import com.uas.platform.b2b.dao.MakeOrderChangeIndexDao;
+import com.uas.platform.b2b.dao.MakeOrderChangeItemDao;
+import com.uas.platform.b2b.dao.MakeOrderDao;
+import com.uas.platform.b2b.event.MakeOrderChangeSaveEvent;
+import com.uas.platform.b2b.model.MakeOrder;
+import com.uas.platform.b2b.model.MakeOrderChangeItem;
+import com.uas.platform.b2b.service.MakeOrderChangeService;
+import com.uas.platform.b2b.support.SystemSession;
+import com.uas.platform.b2b.support.XingePusher;
+import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.Status;
+import com.uas.platform.core.persistence.criteria.PredicateUtils;
+
+
+@Service
+public class MakeOrderChangeServiceImpl implements MakeOrderChangeService {
+	
+	@Autowired
+	private MakeOrderChangeItemDao makeOrderChangeItemDao;
+	
+	@Autowired
+	private MakeOrderChangeIndexDao makeOrderChangeIndexDao;
+	
+	@Autowired
+	private MakeOrderDao makeOrderDao;
+
+	@Override
+	public void save(List<MakeOrderChangeItem> changeItems) {
+		List<MakeOrderChangeItem> newItems = makeOrderChangeItemDao.save(changeItems);
+		
+		// 委外变更单无需供应商确认,直接修改委外加工单的数据
+		for(MakeOrderChangeItem item : newItems) {
+			changeMakeOrder(item, true);
+		}
+		
+		// 关键词索引 + 消息推送
+		ContextUtils.publishEvent(new MakeOrderChangeSaveEvent(newItems));
+	}
+
+	@Override
+	public Page<MakeOrderChangeItem> findAllByPageInfo(final PageInfo pageInfo,
+			String keyword) {
+		if (StringUtils.hasText(keyword))
+			pageInfo.expression(PredicateUtils.in("id", makeOrderChangeIndexDao.findByKeyword(SystemSession
+					.getUser().getEnterprise().getUu(), keyword), false));
+		return makeOrderChangeItemDao.findAll(new Specification<MakeOrderChangeItem>() {
+			public Predicate toPredicate(Root<MakeOrderChangeItem> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
+				return query.where(pageInfo.getPredicates(root, query, builder)).getRestriction();
+			}
+		}, pageInfo);
+	}
+
+	@Override
+	public MakeOrderChangeItem reply(MakeOrderChangeItem item) {
+		item.setReplyDate(new Date());// 回复时间为服务器当前时间
+		return reply(item, true);
+	}
+
+	/**
+	 * @param item
+	 * @param isB2b
+	 *            是否在平台操作
+	 */
+	private MakeOrderChangeItem reply(MakeOrderChangeItem item, boolean isB2b) {
+		MakeOrderChangeItem changeItem = makeOrderChangeItemDao.findOne(item.getId());
+		changeItem.setStatus((short) Status.REPLIED.value());
+		changeItem.setAgreed(item.getAgreed());
+		changeItem.setReplyRemark(item.getReplyRemark());
+		changeItem.setReplySendStatus((short) Status.NOT_UPLOAD.value());
+		if (isB2b){
+			changeItem.setReplyBackStatus((short) Status.NOT_UPLOAD.value());
+		} else {
+			changeItem.setReplyBackStatus((short) Status.DOWNLOADED.value());
+		}
+		changeItem = makeOrderChangeItemDao.save(changeItem);
+		// 将回复信息推送给采购企业采购员(或管理员)
+		if (changeItem.getOrderChange().getUserUU() != null) {
+			Long userUU = changeItem.getOrderChange().getUserUU();
+			// Android
+			XingePusher.pushSingleAccountAndroid(userUU.toString(), (changeItem.isAgreed()? "同意了" : "不同意") + 
+					"您的委外变更", "供应商:" + changeItem.getOrderChange().getEnterprise().getEnName(),
+					null);
+			// IOS
+			XingePusher.pushSingleAccountIOS(userUU.toString(), (changeItem.isAgreed()? "同意了" : "不同意") + 
+					"您的委外变更" + ",供应商:" + changeItem.getOrderChange().getEnterprise().getEnName());
+		}
+		return changeItem;
+	}
+
+	@Override
+	public List<MakeOrderChangeItem> findNotUploadReply() {
+		Long enUU = SystemSession.getUser().getEnterprise().getUu();
+		return makeOrderChangeItemDao.findByOrderChangeEnUUAndStatusAndReplySendStatus(enUU, (short) Status.REPLIED.value(), 
+				(short) Status.NOT_UPLOAD.value());
+	}
+
+	@Override
+	public void onReplyUploadSuccess(String[] idArray) {
+		for(String id : idArray) {
+			MakeOrderChangeItem item = makeOrderChangeItemDao.findOne(Long.parseLong(id));
+			item.setReplySendStatus((short) Status.DOWNLOADED.value());
+			makeOrderChangeItemDao.save(item);
+			// 变更委外加工单,修改加工单
+			changeMakeOrder(item, false);
+		}
+	}
+	
+	/**
+	 * 将委外变更信息反映在委外加工单上
+	 * @param item
+	 * @param noNeedAgree 不需要确认
+	 */
+	private void changeMakeOrder(MakeOrderChangeItem item, boolean noNeedAgree) {
+		if(noNeedAgree || item.isAgreed()) {
+			MakeOrder order = makeOrderDao.findOne(item.getOrderId());
+			if(order != null) {
+				if(item.getNewCommence() != null) {
+					order.setCommence(item.getNewCommence());
+				}
+				if(item.getNewComplete() != null) {
+					order.setComplete(item.getNewComplete());
+				}
+				if(item.getNewPrice() != null) {
+					order.setPrice(item.getNewPrice());
+				}
+				if(item.getNewQty() != null) {
+					order.setQty(item.getNewQty());
+				}
+				String remark;
+				if(StringUtils.isEmpty(order.getRemark())) {
+					remark = "";
+				} else {
+					remark = order.getRemark() + ";";
+				}
+				DateFormat format = new SimpleDateFormat("MM-dd HH:mm");
+				order.setRemark(remark + format.format(new Date()) + " 经委外变更单:" + 
+						item.getOrderChange().getCode() + "变更数据;");
+				makeOrderDao.save(order);
+			}
+		}
+	}
+
+	@Override
+	public List<MakeOrderChangeItem> findNotUpload() {
+		return makeOrderChangeItemDao.findByVendUUAndSendStatus(SystemSession.getUser().getEnterprise().getUu(), 
+				(short) Status.NOT_UPLOAD.value());
+	}
+
+	@Override
+	public void onUploadChangeSuccess(String[] idArray) {
+		for(String id : idArray) {
+			MakeOrderChangeItem item = makeOrderChangeItemDao.findOne(Long.parseLong(id));
+			if(item != null) {
+				item.setSendStatus((short) Status.DOWNLOADED.value());
+				makeOrderChangeItemDao.save(item);
+			}
+		}
+	}
+
+}

+ 9 - 2
src/main/java/com/uas/platform/b2b/service/impl/MakeOrderServiceImpl.java

@@ -1,5 +1,6 @@
 package com.uas.platform.b2b.service.impl;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -13,6 +14,7 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
 import com.uas.platform.b2b.core.util.ContextUtils;
@@ -95,8 +97,13 @@ public class MakeOrderServiceImpl implements MakeOrderService {
 
 	@Override
 	public List<MakeOrderReply> reply(List<MakeOrderReply> replies) {
-		// TODO Auto-generated method stub
-		return null;
+		List<MakeOrderReply> newReplies = new ArrayList<MakeOrderReply>();
+		if( ! CollectionUtils.isEmpty(replies)) {
+			for(MakeOrderReply reply : replies) {
+				newReplies.add(reply(reply, false));
+			}
+		}
+		return newReplies;
 	}
 
 	@Override

+ 19 - 1
src/main/java/com/uas/platform/b2b/service/impl/PurchaseOrderServiceImpl.java

@@ -14,6 +14,7 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
 import com.uas.platform.b2b.core.util.ContextUtils;
@@ -45,6 +46,7 @@ import com.uas.platform.core.model.Constant;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.Status;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
+import com.uas.platform.core.util.serializer.FlexJsonUtils;
 
 @Service
 public class PurchaseOrderServiceImpl implements PurchaseOrderService {
@@ -104,11 +106,27 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
 		if(endDate != null)
 			pageInfo.expression(PredicateUtils.in("id", purchaseOrderAllDao.findByEndDate(SystemSession
 					.getUser().getEnterprise().getUu(), new Date(endDate)), false));
-		return purchaseOrderAllDao.findAll(new Specification<PurchaseOrderAll>() {
+		Page<PurchaseOrderAll> pageOrders = purchaseOrderAllDao.findAll(new Specification<PurchaseOrderAll>() {
 			public Predicate toPredicate(Root<PurchaseOrderAll> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
 				return query.where(pageInfo.getPredicates(root, query, builder)).getRestriction();
 			}
 		}, pageInfo);
+		// 明细包含关键词
+		if(StringUtils.hasText(keyword)) {
+			List<PurchaseOrderAll> orders = pageOrders.getContent();
+			if( ! CollectionUtils.isEmpty(orders)) {
+				for(PurchaseOrderAll order : orders) {
+					if( ! CollectionUtils.isEmpty(order.getOrderItems())) {
+						for(PurchaseOrderAllItem orderItem : order.getOrderItems()) {
+							if(FlexJsonUtils.toJson(orderItem).contains(keyword)) {
+								orderItem.setKey(true);
+							}
+						}
+					}
+				}
+			}
+		}
+		return pageOrders;
 	}
 
 	@Override