Преглед изворни кода

Merge remote-tracking branch 'origin/purchaseChange' into dev

Hu Jie пре 7 година
родитељ
комит
5b4f9d7bae
29 измењених фајлова са 2608 додато и 335 уклоњено
  1. 334 0
      src/main/java/com/uas/platform/b2b/controller/PurcOrderChangeController.java
  2. 5 37
      src/main/java/com/uas/platform/b2b/controller/SaleOrderChangeController.java
  3. 2 5
      src/main/java/com/uas/platform/b2b/controller/SaleOrderController.java
  4. 8 0
      src/main/java/com/uas/platform/b2b/dao/PurchaseOrderChangeDao.java
  5. 15 0
      src/main/java/com/uas/platform/b2b/dao/PurchaseOrderInfoDao.java
  6. 14 0
      src/main/java/com/uas/platform/b2b/model/PurchaseOrderAll.java
  7. 14 0
      src/main/java/com/uas/platform/b2b/model/PurchaseOrderAllItem.java
  8. 8 19
      src/main/java/com/uas/platform/b2b/model/PurchaseOrderChange.java
  9. 8 0
      src/main/java/com/uas/platform/b2b/search/SearchService.java
  10. 17 0
      src/main/java/com/uas/platform/b2b/search/SearchServiceImpl.java
  11. 51 0
      src/main/java/com/uas/platform/b2b/service/PurcOrderChangeService.java
  12. 0 54
      src/main/java/com/uas/platform/b2b/service/PurchaseOrderService.java
  13. 1 0
      src/main/java/com/uas/platform/b2b/service/impl/BaseInfoServiceImpl.java
  14. 1 0
      src/main/java/com/uas/platform/b2b/service/impl/CartServiceImpl.java
  15. 267 0
      src/main/java/com/uas/platform/b2b/service/impl/PurcOrderChangeServiceImpl.java
  16. 40 0
      src/main/java/com/uas/platform/b2b/service/impl/PurchaseOrderChangeServiceImpl.java
  17. 1 178
      src/main/java/com/uas/platform/b2b/service/impl/PurchaseOrderServiceImpl.java
  18. BIN
      src/main/resources/jxls-tpl/sale/purcChange.xls
  19. 1 1
      src/main/webapp/WEB-INF/web.xml
  20. 426 4
      src/main/webapp/resources/js/index/app.js
  21. 73 0
      src/main/webapp/resources/js/index/services/PurcChange.js
  22. 398 0
      src/main/webapp/resources/tpl/index/purc/changeList.html
  23. 204 0
      src/main/webapp/resources/tpl/index/purc/change_detail.html
  24. 342 0
      src/main/webapp/resources/tpl/index/purc/change_new.html
  25. 6 0
      src/main/webapp/resources/tpl/index/purc/left.html
  26. 283 0
      src/main/webapp/resources/tpl/index/purc/modal/enableOrderList.html
  27. 45 19
      src/main/webapp/resources/tpl/index/sale/change.html
  28. 43 17
      src/main/webapp/resources/tpl/index/sale/change_detail.html
  29. 1 1
      src/main/webapp/resources/tpl/index/sale/order_detail.html

+ 334 - 0
src/main/java/com/uas/platform/b2b/controller/PurcOrderChangeController.java

@@ -0,0 +1,334 @@
+package com.uas.platform.b2b.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.uas.platform.b2b.model.PurchaseOrderAll;
+import com.uas.platform.b2b.model.PurchaseOrderChange;
+import com.uas.platform.b2b.model.SearchFilter;
+import com.uas.platform.b2b.search.SearchService;
+import com.uas.platform.b2b.service.PurcOrderChangeService;
+import com.uas.platform.b2b.service.PurchaseOrderChangeService;
+import com.uas.platform.b2b.service.UserService;
+import com.uas.platform.b2b.support.JxlsExcelView;
+import com.uas.platform.b2b.support.SPageUtils;
+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.Constant;
+import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
+import com.uas.platform.core.model.Status;
+import com.uas.platform.core.web.bind.RequestState;
+import com.uas.search.b2b.model.SPage;
+import com.uas.search.b2b.model.Sort;
+import com.uas.search.b2b.util.SearchConstants;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.ui.ModelMap;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 采购变更单
+ *
+ * Created by hejq on 2018-06-22.
+ */
+@RestController
+@RequestMapping("/purc/change")
+public class PurcOrderChangeController {
+
+    @Autowired
+    private PurcOrderChangeService orderChangeService;
+
+    @Autowired
+    private SearchService searchService;
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private PurchaseOrderChangeService purchaseOrderChangeService;
+
+    private final static UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
+
+    /**
+     * 查询可以做采购变更单的采购单
+     *
+     * @param pageParams
+     * @param searchFilter
+     * @return
+     */
+    @RequestMapping(value = "/enable/orderList", method = RequestMethod.GET)
+    public SPage<PurchaseOrderAll> findByPageInfo(PageParams pageParams, String searchFilter) {
+        SPage<PurchaseOrderAll> sPage = new SPage<>();
+        PageInfo pageInfo = new PageInfo(pageParams);
+        SearchFilter filter =  JSONObject.parseObject(searchFilter, SearchFilter.class);
+        com.uas.search.b2b.model.PageParams params = searchService.convertPageParams(pageParams, searchFilter);
+        if (!StringUtils.isEmpty(filter.getKeyword())) {
+            params.getFilters().put("pu_enuu", SystemSession.getUser().getEnterprise().getUu());
+            params.getFilters().put("pu_source", "B2B");
+            Map<String,Object> map = new HashMap<>();
+            map.put("pu_status", Status.UNAUDIT.value());
+            params.setNotEqualFilters(map);
+            List<Sort> sortList = new ArrayList<>();
+            sortList.add(new Sort("pu_id", false, Sort.Type.LONG, new Long(1)));
+            params.getFilters().put(SearchConstants.SORT_KEY, sortList);
+            sPage = searchService.findEnableToChange(filter.getKeyword(), params);
+        } else {
+            pageInfo.filter("enUU", SystemSession.getUser().getEnterprise().getUu());
+            pageInfo.filter("source","B2B");
+            sPage = orderChangeService.findEnableToChange(pageInfo, filter);
+        }
+        return orderChangeService.filterChangeItem(sPage);
+    }
+
+    /**
+     * 新增采购变更单
+     *
+     * @param change 采购变更单
+     * @return
+     */
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    public ModelMap saveChange(@RequestBody PurchaseOrderChange change) {
+        return orderChangeService.save(change);
+    }
+
+    /**
+     * 以客户的角度,查询所有采购变更单
+     *
+     * @param params 分页信息
+     * @param searchFilter 过滤条件
+     * @return
+     */
+    @RequestMapping(value = "/info",method = RequestMethod.GET)
+    public SPage<PurchaseOrderChange> getAllPurcOrderChange(PageParams params, String searchFilter) {
+        SearchFilter filter =  JSONObject.parseObject(searchFilter, SearchFilter.class);
+        com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, searchFilter);
+        // 当前登录企业作为买方
+        if (!StringUtils.isEmpty(filter.getKeyword())) {
+            pageParams.getFilters().put("pc_enuu", SystemSession.getUser().getEnterprise().getUu());
+            List<Sort> sortList = new ArrayList<>();
+            sortList.add(new Sort("pc_id", false, Sort.Type.LONG, new Long(1)));
+            pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+            return searchService.searchPurchaseOrderChangeIds(filter.getKeyword(), pageParams);
+        } else {
+            PageInfo pageInfo = new PageInfo(params);
+            pageInfo.filter("enUU", SystemSession.getUser().getEnterprise().getUu());
+            return SPageUtils.covertSPage(orderChangeService.findByPageInfo(pageInfo, filter));
+        }
+    }
+
+    /**
+     * 以客户的角度,查询采购变更单(待确认)
+     *
+     * @param params 分页信息
+     * @param searchFilter 过滤条件
+     * @return
+     */
+    @RequestMapping(value = "/info", params = RequestState.TODO, method = RequestMethod.GET)
+    public SPage<PurchaseOrderChange> getPurcOrderChangeTodo(PageParams params, String searchFilter) {
+        SearchFilter filter =  JSONObject.parseObject(searchFilter, SearchFilter.class);
+        com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, searchFilter);
+        // 当前登录企业作为买方
+        if (!StringUtils.isEmpty(filter.getKeyword())) {
+            pageParams.getFilters().put("pc_enuu", SystemSession.getUser().getEnterprise().getUu());
+            pageParams.getFilters().put("pc_status", Status.NOT_REPLY.value());
+            pageParams.getFilters().put("pc_unneedreply", Constant.NO);
+            List<Sort> sortList = new ArrayList<>();
+            sortList.add(new Sort("pc_id", false, Sort.Type.LONG, new Long(1)));
+            pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+            return searchService.searchPurchaseOrderChangeIds(filter.getKeyword(), pageParams);
+        } else {
+            PageInfo pageInfo = new PageInfo(params);
+            pageInfo.filter("enUU", SystemSession.getUser().getEnterprise().getUu());
+            pageInfo.filter("status",Status.NOT_REPLY.value());
+            pageInfo.filter("unNeedReply",Constant.NO);
+            return SPageUtils.covertSPage(orderChangeService.findByPageInfo(pageInfo, filter));
+        }
+    }
+
+    /**
+     * 以客户的角度,查询采购变更单(已处理)
+     *
+     * @param params 分页信息
+     * @param searchFilter 过滤条件
+     * @return
+     */
+    @RequestMapping(value = "/info", params = RequestState.DONE, method = RequestMethod.GET)
+    public SPage<PurchaseOrderChange> getPurcOrderChangeDone(PageParams params, String searchFilter) {
+        SearchFilter filter =  JSONObject.parseObject(searchFilter, SearchFilter.class);
+        com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, searchFilter);
+        // 当前登录企业作为买方
+        if (!StringUtils.isEmpty(filter.getKeyword())) {
+            pageParams.getFilters().put("pc_enuu", SystemSession.getUser().getEnterprise().getUu());
+            pageParams.getFilters().put("pc_status", Status.REPLIED.value());
+            pageParams.getFilters().put("pc_unneedreply", Constant.NO);
+            List<Sort> sortList = new ArrayList<>();
+            sortList.add(new Sort("pc_id", false, Sort.Type.LONG, new Long(1)));
+            pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+            return searchService.searchPurchaseOrderChangeIds(filter.getKeyword(), pageParams);
+        } else {
+            PageInfo pageInfo = new PageInfo(params);
+            pageInfo.filter("enUU", SystemSession.getUser().getEnterprise().getUu());
+            pageInfo.filter("status",Status.REPLIED.value());
+            pageInfo.filter("unNeedReply",Constant.NO);
+            return SPageUtils.covertSPage(orderChangeService.findByPageInfo(pageInfo, filter));
+        }
+    }
+
+    /**
+     * 以客户的角度,查询采购变更单(无需确认)
+     *
+     * @param params 分页信息
+     * @param searchFilter 过滤条件
+     * @return
+     */
+    @RequestMapping(value = "/info", params = RequestState.UNREAD, method = RequestMethod.GET)
+    public SPage<PurchaseOrderChange> getPurcOrderChangeUnread(PageParams params, String searchFilter) {
+        SearchFilter filter =  JSONObject.parseObject(searchFilter, SearchFilter.class);
+        com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, searchFilter);
+        // 当前登录企业作为买方
+        if (!StringUtils.isEmpty(filter.getKeyword())) {
+            pageParams.getFilters().put("pc_enuu", SystemSession.getUser().getEnterprise().getUu());
+            pageParams.getFilters().put("pc_unneedreply", Constant.YES);
+            List<Sort> sortList = new ArrayList<>();
+            sortList.add(new Sort("pc_id", false, Sort.Type.LONG, new Long(1)));
+            pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+            return searchService.searchPurchaseOrderChangeIds(filter.getKeyword(), pageParams);
+        } else {
+            PageInfo pageInfo = new PageInfo(params);
+            pageInfo.filter("enUU", SystemSession.getUser().getEnterprise().getUu());
+            pageInfo.filter("unNeedReply",Constant.YES);
+            return SPageUtils.covertSPage(orderChangeService.findByPageInfo(pageInfo, filter));
+        }
+    }
+
+    /**
+     * 导出  -全部
+     * @param params
+     * @param searchFilter
+     * @return
+     */
+    @RequestMapping(value = "/xls", method = RequestMethod.GET)
+    public ModelAndView exportChanges(PageParams params, String searchFilter) {
+        PageInfo pageInfo = new PageInfo(1, JxlsExcelView.MAX_SIZE, 0);
+        pageInfo.filter("enUU", SystemSession.getUser().getEnterprise().getUu());
+        SearchFilter filter = JSONObject.parseObject(searchFilter, SearchFilter.class);
+        params.setPage(1);
+        params.setCount(SearchConstants.TOP_NUM);
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
+        ModelAndView modelAndView = new ModelAndView();
+        modelAndView.addObject("dateFormat", dateFormat);
+        modelAndView.addObject("state", "全部");
+        modelAndView.addObject("data", filter.getKeyword() == null ? orderChangeService.findByPageInfo(pageInfo, filter).getContent()
+                : getAllPurcOrderChange(params, searchFilter).getContent());
+        modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/sale/purcChange", "采购变更单列表_全部"));
+        logger.log("采购变更单", "导出Excel列表", "导出全部Excel列表");
+        return modelAndView;
+    }
+
+    /**
+     * 导出  -已处理
+     * @param params
+     * @param searchFilter
+     * @return
+     */
+    @RequestMapping(value = "/xls",params = RequestState.DONE, method = RequestMethod.GET)
+    public ModelAndView exportChangesDone(PageParams params, String searchFilter) {
+        PageInfo pageInfo = new PageInfo(1, JxlsExcelView.MAX_SIZE, 0);
+        pageInfo.filter("enUU", SystemSession.getUser().getEnterprise().getUu());
+        pageInfo.filter("status",Status.REPLIED.value());
+        SearchFilter filter = JSONObject.parseObject(searchFilter, SearchFilter.class);
+        params.setPage(1);
+        params.setCount(SearchConstants.TOP_NUM);
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
+        ModelAndView modelAndView = new ModelAndView();
+        modelAndView.addObject("dateFormat", dateFormat);
+        modelAndView.addObject("state", "已处理");
+        modelAndView.addObject("data", filter.getKeyword() == null ? orderChangeService.findByPageInfo(pageInfo, filter).getContent()
+                : getPurcOrderChangeDone(params, searchFilter).getContent());
+        modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/sale/purcChange", "采购变更单列表_已处理"));
+        logger.log("采购变更单", "导出Excel列表", "导出已处理Excel列表");
+        return modelAndView;
+    }
+
+    /**
+     * 导出  -待确认
+     * @param params
+     * @param searchFilter
+     * @return
+     */
+    @RequestMapping(value = "/xls",params = RequestState.TODO, method = RequestMethod.GET)
+    public ModelAndView exportChangesTodo(PageParams params, String searchFilter) {
+        PageInfo pageInfo = new PageInfo(1, JxlsExcelView.MAX_SIZE, 0);
+        pageInfo.filter("enUU", SystemSession.getUser().getEnterprise().getUu());
+        pageInfo.filter("status",Status.NOT_REPLY.value());
+        pageInfo.filter("unNeedReply",Constant.NO);
+        SearchFilter filter = JSONObject.parseObject(searchFilter, SearchFilter.class);
+        params.setPage(1);
+        params.setCount(SearchConstants.TOP_NUM);
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
+        ModelAndView modelAndView = new ModelAndView();
+        modelAndView.addObject("dateFormat", dateFormat);
+        modelAndView.addObject("state", "待确认");
+        modelAndView.addObject("data", filter.getKeyword() == null ? orderChangeService.findByPageInfo(pageInfo, filter).getContent()
+                : getPurcOrderChangeTodo(params, searchFilter).getContent());
+        modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/sale/purcChange", "采购变更单列表_待确认"));
+        logger.log("采购变更单", "导出Excel列表", "导出待确认Excel列表");
+        return modelAndView;
+    }
+
+    /**
+     * 导出  -无需确认
+     * @param params
+     * @param searchFilter
+     * @return
+     */
+    @RequestMapping(value = "/xls",params = RequestState.UNREAD, method = RequestMethod.GET)
+    public ModelAndView exportChangesUnread(PageParams params, String searchFilter) {
+        PageInfo pageInfo = new PageInfo(1, JxlsExcelView.MAX_SIZE, 0);
+        pageInfo.filter("enUU", SystemSession.getUser().getEnterprise().getUu());
+        pageInfo.filter("unNeedReply",Constant.YES);
+        SearchFilter filter = JSONObject.parseObject(searchFilter, SearchFilter.class);
+        params.setPage(1);
+        params.setCount(SearchConstants.TOP_NUM);
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
+        ModelAndView modelAndView = new ModelAndView();
+        modelAndView.addObject("dateFormat", dateFormat);
+        modelAndView.addObject("state", "已处理");
+        modelAndView.addObject("data", filter.getKeyword() == null ? orderChangeService.findByPageInfo(pageInfo, filter).getContent()
+                : getPurcOrderChangeUnread(params, searchFilter).getContent());
+        modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/sale/purcChange", "采购变更单列表_无需确认"));
+        logger.log("采购变更单", "导出Excel列表", "导出无需确认Excel列表");
+        return modelAndView;
+    }
+
+    /**
+     * 导出权限判断
+     *
+     * @return
+     */
+    @RequestMapping(value = "/xls/permission", method = RequestMethod.GET)
+    @ResponseBody
+    public ModelMap exportPermission() {
+        return new ModelMap("success", true);
+    }
+
+    /**
+     * 作为买家,根据变更单ID查找采购变更单(含明细)
+     *
+     * @param id
+     * @return
+     */
+    @RequestMapping(value = "/{id}/info", method = RequestMethod.GET)
+    @ResponseBody
+    public PurchaseOrderChange findOrderChangeById(@PathVariable("id") Long id) {
+        return purchaseOrderChangeService.findById(id);
+    }
+}

+ 5 - 37
src/main/java/com/uas/platform/b2b/controller/SaleOrderChangeController.java

@@ -8,6 +8,7 @@ import com.uas.platform.b2b.search.SearchService;
 import com.uas.platform.b2b.service.PurchaseOrderChangeService;
 import com.uas.platform.b2b.service.UserService;
 import com.uas.platform.b2b.support.JxlsExcelView;
+import com.uas.platform.b2b.support.SPageUtils;
 import com.uas.platform.b2b.support.SystemSession;
 import com.uas.platform.b2b.support.UsageBufferedLogger;
 import com.uas.platform.core.logging.BufferedLoggerManager;
@@ -23,7 +24,6 @@ import com.uas.search.b2b.model.Sort;
 import com.uas.search.b2b.model.Sort.Type;
 import com.uas.search.b2b.util.SearchConstants;
 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;
@@ -203,7 +203,6 @@ public class SaleOrderChangeController {
 	@RequestMapping(value = "/info/nosearch", method = RequestMethod.GET)
 	@ResponseBody
 	public SPage<PurchaseOrderChange> getAllOrderChanges(PageParams params, String searchFilter) {
-		SPage<PurchaseOrderChange> orders = new SPage<PurchaseOrderChange>();
 		PageInfo pageInfo = new PageInfo(params);
 		pageInfo.filter("vendUU", SystemSession.getUser().getEnterprise().getUu());
 		SearchFilter filter = JSONObject.parseObject(searchFilter, SearchFilter.class);
@@ -214,14 +213,7 @@ public class SaleOrderChangeController {
 		if (distribute != null && !CollectionUtils.isEmpty(distribute.getDistribute())) {
 			filter.setDistribute(distribute.getDistribute());
 		}
-		// filter.setDistribute(userService.distribute().getDistribute());
-		Page<PurchaseOrderChange> orderchanges = purchaseOrderChangeService.findAllByPageInfo(pageInfo, null, filter);
-		orders.setContent(orderchanges.getContent());
-		orders.setPage(orderchanges.getNumber());
-		orders.setSize(orderchanges.getSize());
-		orders.setTotalElement(orderchanges.getTotalElements());
-		orders.setTotalPage(orderchanges.getTotalPages());
-		return orders;
+		return SPageUtils.covertSPage(purchaseOrderChangeService.findAllByPageInfo(pageInfo, null, filter));
 	}
 
 	/**
@@ -234,7 +226,6 @@ public class SaleOrderChangeController {
 	@RequestMapping(value = "/info/nosearch", params = RequestState.TODO, method = RequestMethod.GET)
 	@ResponseBody
 	public SPage<PurchaseOrderChange> getTodoOrderChanges(PageParams params, String searchFilter) {
-		SPage<PurchaseOrderChange> orders = new SPage<PurchaseOrderChange>();
 		PageInfo pageInfo = new PageInfo(params);
 		pageInfo.filter("status", Status.NOT_REPLY.value());
 		pageInfo.filter("unNeedReply", Constant.NO);
@@ -247,14 +238,7 @@ public class SaleOrderChangeController {
 		if (distribute != null && !CollectionUtils.isEmpty(distribute.getDistribute())) {
 			filter.setDistribute(distribute.getDistribute());
 		}
-		// filter.setDistribute(userService.distribute().getDistribute());
-		Page<PurchaseOrderChange> orderchanges = purchaseOrderChangeService.findAllByPageInfo(pageInfo, null, filter);
-		orders.setContent(orderchanges.getContent());
-		orders.setPage(orderchanges.getNumber());
-		orders.setSize(orderchanges.getSize());
-		orders.setTotalElement(orderchanges.getTotalElements());
-		orders.setTotalPage(orderchanges.getTotalPages());
-		return orders;
+		return SPageUtils.covertSPage(purchaseOrderChangeService.findAllByPageInfo(pageInfo, null, filter));
 	}
 
 	/**
@@ -267,7 +251,6 @@ public class SaleOrderChangeController {
 	@RequestMapping(value = "/info/nosearch", params = RequestState.DONE, method = RequestMethod.GET)
 	@ResponseBody
 	public SPage<PurchaseOrderChange> getDoneOrderChanges(PageParams params, String searchFilter) {
-		SPage<PurchaseOrderChange> orders = new SPage<PurchaseOrderChange>();
 		PageInfo pageInfo = new PageInfo(params);
 		pageInfo.filter("status", Status.REPLIED.value());
 		pageInfo.filter("unNeedReply", Constant.NO);
@@ -280,14 +263,7 @@ public class SaleOrderChangeController {
 		if (distribute != null && !CollectionUtils.isEmpty(distribute.getDistribute())) {
 			filter.setDistribute(distribute.getDistribute());
 		}
-		// filter.setDistribute(userService.distribute().getDistribute());
-		Page<PurchaseOrderChange> orderchanges = purchaseOrderChangeService.findAllByPageInfo(pageInfo, null, filter);
-		orders.setContent(orderchanges.getContent());
-		orders.setPage(orderchanges.getNumber());
-		orders.setSize(orderchanges.getSize());
-		orders.setTotalElement(orderchanges.getTotalElements());
-		orders.setTotalPage(orderchanges.getTotalPages());
-		return orders;
+		return SPageUtils.covertSPage(purchaseOrderChangeService.findAllByPageInfo(pageInfo, null, filter));
 	}
 
 	/**
@@ -300,7 +276,6 @@ public class SaleOrderChangeController {
 	@RequestMapping(value = "/info/nosearch", params = RequestState.UNREAD, method = RequestMethod.GET)
 	@ResponseBody
 	public SPage<PurchaseOrderChange> getUnReadOrderChanges(PageParams params, String searchFilter) {
-		SPage<PurchaseOrderChange> orders = new SPage<PurchaseOrderChange>();
 		PageInfo pageInfo = new PageInfo(params);
 		pageInfo.filter("unNeedReply", Constant.YES);
 		pageInfo.filter("vendUU", SystemSession.getUser().getEnterprise().getUu());
@@ -312,14 +287,7 @@ public class SaleOrderChangeController {
 		if (distribute != null && !CollectionUtils.isEmpty(distribute.getDistribute())) {
 			filter.setDistribute(distribute.getDistribute());
 		}
-		// filter.setDistribute(userService.distribute().getDistribute());
-		Page<PurchaseOrderChange> orderchanges = purchaseOrderChangeService.findAllByPageInfo(pageInfo, null, filter);
-		orders.setContent(orderchanges.getContent());
-		orders.setPage(orderchanges.getNumber());
-		orders.setSize(orderchanges.getSize());
-		orders.setTotalElement(orderchanges.getTotalElements());
-		orders.setTotalPage(orderchanges.getTotalPages());
-		return orders;
+		return SPageUtils.covertSPage(purchaseOrderChangeService.findAllByPageInfo(pageInfo, null, filter));
 	}
 
 	/**

+ 2 - 5
src/main/java/com/uas/platform/b2b/controller/SaleOrderController.java

@@ -606,7 +606,8 @@ public class SaleOrderController {
 		orderItem.setId(orderItemId);
 		reply.setOrderItem(orderItem);
 		boolean flag = tokenService.enabled(token);
-		if (flag) {// 如果token存在,才进行操作处理
+		// 如果token存在,才进行操作处理
+		if (flag) {
 			reply = purchaseOrderService.reply(reply);
 			// 清除token
 			tokenService.delete(token);
@@ -660,10 +661,6 @@ public class SaleOrderController {
 	 */
 	@RequestMapping(value = "/items/reply", method = RequestMethod.POST)
 	public ResponseEntity<String> replyOrderItems(Long date, @RequestBody String idString) {
-//		List<PurchaseOrderReply> replies = purchaseOrderService.reply(idString.split(","), date);
-//		for (PurchaseOrderReply reply : replies)
-//			logger.log("客户采购单", "批量回复客户采购明细", reply.replyDescription(), reply.getOrderItem().getOrder().getCode(),
-//					reply.getOrderItem().getId());
         purchaseOrderService.replyByBatch(idString, SystemSession.getUser().getUserName(), SystemSession.getUser().getIp(), SystemSession.getUser().getEnterprise().getUu(), SystemSession.getUser().getUserUU(), date);
 		return new ResponseEntity<String>(HttpStatus.OK);
 	}

+ 8 - 0
src/main/java/com/uas/platform/b2b/dao/PurchaseOrderChangeDao.java

@@ -125,4 +125,12 @@ public interface PurchaseOrderChangeDao extends JpaSpecificationExecutor<Purchas
 	@Query("select p.id from PurchaseOrderChange p where p.id in :ids and p.agreed=0 and (p.unNeedReply is null or p.unNeedReply=0)")
 	List<Long> findNotReplyId(@Param("ids") List<Long> ids);
 
+	/**
+	 * 帅选出正在变更的单据
+	 * @param orderId 采购单id
+	 * @return
+	 */
+	@Query("select p from PurchaseOrderChange p where p.orderId = :orderId and p.agreed is null  and p.unNeedReply=0")
+	List<PurchaseOrderChange> findByOrderId(@Param("orderId") Long orderId);
+
 }

+ 15 - 0
src/main/java/com/uas/platform/b2b/dao/PurchaseOrderInfoDao.java

@@ -0,0 +1,15 @@
+package com.uas.platform.b2b.dao;
+
+import com.uas.platform.b2b.model.PurchaseOrderInfo;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 平台里面,以供应商的角度来查看采购订单
+ *
+ * Created by hejq on 2018-06-25.
+ */
+@Repository
+public interface PurchaseOrderInfoDao extends JpaRepository<PurchaseOrderInfo, Long>, JpaSpecificationExecutor<PurchaseOrderInfo> {
+}

+ 14 - 0
src/main/java/com/uas/platform/b2b/model/PurchaseOrderAll.java

@@ -278,6 +278,12 @@ public class PurchaseOrderAll {
 	@Column(name = "pu_auid")
     private Long auId;
 
+	/**
+	 * 订单来源(UAS,B2B)
+	 */
+	@Column(name = "pu_source")
+	private String source;
+
 	public String getPurpose() {
 		return purpose;
 	}
@@ -613,4 +619,12 @@ public class PurchaseOrderAll {
     public void setAuId(Long auId) {
         this.auId = auId;
     }
+
+	public String getSource() {
+		return source;
+	}
+
+	public void setSource(String source) {
+		this.source = source;
+	}
 }

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

@@ -181,6 +181,12 @@ public class PurchaseOrderAllItem {
     @Column(name = "pd_audid")
     private Long audId;
 
+	/**
+	 * 是否在变更中
+	 */
+	@Transient
+    private Boolean isChange;
+
 	/**
 	 * 最后一次回复数量
 	 */
@@ -397,6 +403,14 @@ public class PurchaseOrderAllItem {
 		this.erpDate = erpDate;
 	}
 
+	public Boolean getChange() {
+		return isChange;
+	}
+
+	public void setChange(Boolean change) {
+		isChange = change;
+	}
+
 	public String getProdsource() {
 		// 默认是供应商的物料
 		return StringUtils.isEmpty(prodsource) ? "seller" : prodsource;

+ 8 - 19
src/main/java/com/uas/platform/b2b/model/PurchaseOrderChange.java

@@ -1,28 +1,14 @@
 package com.uas.platform.b2b.model;
 
+import com.alibaba.fastjson.annotation.JSONField;
+import com.uas.platform.core.model.Constant;
+import org.codehaus.jackson.annotate.JsonIgnore;
+
+import javax.persistence.*;
 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 org.codehaus.jackson.annotate.JsonIgnore;
-
-import com.alibaba.fastjson.annotation.JSONField;
-import com.uas.platform.core.model.Constant;
-
 /**
  * 平台里面,以供应商的角度来查看采购订单变更单 <br>
  * 级联变更明细
@@ -195,6 +181,9 @@ public class PurchaseOrderChange implements Serializable {
 	@Column(name = "pc_oldrate")
 	private Float oldRate;
 
+	/**
+	 * 对应采购单ID
+	 */
 	@Column(name = "pc_puid")
 	private Long orderId;
 

+ 8 - 0
src/main/java/com/uas/platform/b2b/search/SearchService.java

@@ -141,6 +141,14 @@ public interface SearchService {
 	 */
 	public SPage<PurchaseOrderChange> searchPurchaseOrderChangeIds(String keyword, PageParams pageParams);
 
+	/**
+	 * 查询可变更的采购单
+	 * @param keyword
+	 * @param pageParams
+	 * @return
+	 */
+	public SPage<PurchaseOrderAll> findEnableToChange(String keyword, PageParams pageParams);
+
 	/**
 	 * 客户打样申请单(所有)
 	 * 

+ 17 - 0
src/main/java/com/uas/platform/b2b/search/SearchServiceImpl.java

@@ -475,6 +475,23 @@ public class SearchServiceImpl implements com.uas.platform.b2b.search.SearchServ
 		return toSPage(idsPage, content);
 	}
 
+	public SPage<PurchaseOrderAll> findEnableToChange(String keyword, PageParams pageParams) {
+		SPage<Long> idsPage = searchService.searchIds(keyword, Table_name.PURC$ORDERS, pageParams);
+		List<PurchaseOrderAll> content = purchaseOrderAllDao.findAll(idsPage.getContent());
+		if (!CollectionUtils.isEmpty(content)) {
+			for (PurchaseOrderAll orderAll : content) {
+				if (!CollectionUtils.isEmpty(orderAll.getOrderItems())) {
+					for (PurchaseOrderAllItem item : orderAll.getOrderItems()) {
+						item.setLatestReplyQty(purchaseOrderService.findLastReplyQty(item.getId()));
+					}
+				}
+			}
+		}
+		sortByProperty(content, PurchaseOrderAll.class, "id", idsPage.getContent());
+		return toSPage(idsPage, content);
+	}
+
+
 	/**
 	 * 打样申请单
 	 */

+ 51 - 0
src/main/java/com/uas/platform/b2b/service/PurcOrderChangeService.java

@@ -0,0 +1,51 @@
+package com.uas.platform.b2b.service;
+
+import com.uas.platform.b2b.model.PurchaseOrderAll;
+import com.uas.platform.b2b.model.PurchaseOrderChange;
+import com.uas.platform.b2b.model.SearchFilter;
+import com.uas.platform.core.model.PageInfo;
+import com.uas.search.b2b.model.SPage;
+import org.springframework.data.domain.Page;
+import org.springframework.ui.ModelMap;
+
+/**
+ * 采购变更单
+ *
+ * Created by hejq on 2018-06-22.
+ */
+public interface PurcOrderChangeService {
+
+    /**
+     * 查询符合条件的能变更的采购单
+     *
+     * @param pageInfo 分页信息
+     * @param searchFilter 过滤条件
+     * @return
+     */
+    SPage<PurchaseOrderAll> findEnableToChange(PageInfo pageInfo, SearchFilter searchFilter);
+
+    /**
+     * 过滤变更明细
+     *
+     * @param sPage 分页数据
+     * @return
+     */
+    SPage<PurchaseOrderAll> filterChangeItem(SPage<PurchaseOrderAll> sPage);
+
+    /**
+     * 新增采购变更单
+     *
+     * @param change 采购变更单信息
+     * @return
+     */
+    ModelMap save(PurchaseOrderChange change);
+
+    /**
+     * 通过分页信息查询采购变更单
+     *
+     * @param pageInfo 分页信息
+     * @param filter 过滤条件
+     * @return
+     */
+    Page<PurchaseOrderChange> findByPageInfo(PageInfo pageInfo, SearchFilter filter);
+}

+ 0 - 54
src/main/java/com/uas/platform/b2b/service/PurchaseOrderService.java

@@ -83,14 +83,6 @@ public interface PurchaseOrderService {
 	 */
 	public Page<PurchaseOrderWaiting> findWaitingByPageInfo(PageInfo pageInfo, SearchFilter filter);
 
-	/**
-	 * 分页查找订单
-	 *
-	 * @param pageInfo
-	 * @return
-	 */
-	public Page<PurchaseOrder> findAllOrdersByPageInfo(PageInfo pageInfo, SearchFilter filter);
-
 	/**
 	 * 分页查找订单,包括明细
 	 * 
@@ -153,22 +145,6 @@ public interface PurchaseOrderService {
 	 */
 	public SPage<PurchaseOrderWaiting> findWaitingOrders(PageInfo pageInfo, SearchFilter filter);
 
-	/**
-	 * 分页查找待回复订单,包括明细
-	 * 
-	 * @param pageInfo
-	 * @return
-	 */
-	public Page<PurchaseOrderTodo> findTodoOrdersByPageInfo(PageInfo pageInfo, SearchFilter filter);
-
-	/**
-	 * 分页查找已回复订单,包括明细
-	 * 
-	 * @param pageInfo
-	 * @return
-	 */
-	public Page<PurchaseOrderDone> findDoneOrdersByPageInfo(PageInfo pageInfo, SearchFilter filter);
-
 	/**
 	 * 分页查找已结案订单明细
 	 * 
@@ -177,15 +153,6 @@ public interface PurchaseOrderService {
 	 */
 	public Page<PurchaseOrderEnd> findEndOrdersByPageInfo(PageInfo pageInfo, SearchFilter filter);
 
-	/**
-	 * 分页查找已结案订单明细
-	 * 
-	 * @param pageInfo
-	 * @return
-	 */
-	public Page<PurchaseOrderWaiting> findWaitingOrdersByPageInfo(PageInfo pageInfo, SearchFilter filter);
-
-
 	/**
 	 * 用订单号查找订单
 	 * 
@@ -306,13 +273,6 @@ public interface PurchaseOrderService {
 	 */
 	public int getOnhandCount();
 
-	/**
-	 * 作为客户,获取供应商待回复的采购单条数
-	 * 
-	 * @return
-	 */
-	public int getPurcOnhandCount();
-
 	/**
 	 * 设置订单的查看状态
 	 * 
@@ -352,13 +312,6 @@ public interface PurchaseOrderService {
 	 */
 	public Long getAllCount();
 
-	/**
-	 * 返回企业下的采购订单(UAS用户在平台查询)
-	 * 
-	 * @return
-	 */
-	public long getPurcByenUUAdnStatus(Long uu);
-
 	/**
 	 * 返回未上传的打印记录
 	 *
@@ -407,11 +360,4 @@ public interface PurchaseOrderService {
      */
     public void replyByBatch(String idString, String username, String userip, Long enuu, Long useruu, Long date);
 
-	/**
-	 * 根据企业UU批量处理采购单明细中的物料转入供应商报价人个人物料
-	 *
-	 * @param enUU 采购方企业UU
-	 */
-    void coverPurchaseOrderItemProdToUser(Long enUU) throws Exception;
-
 }

+ 1 - 0
src/main/java/com/uas/platform/b2b/service/impl/BaseInfoServiceImpl.java

@@ -552,6 +552,7 @@ public class BaseInfoServiceImpl implements BaseInfoService {
 			userBaseInfo = userBaseInfos.get(0);
 		}
 		// 主记录
+		order.setSource("B2B");
 		order.setCode(neworder.getCode());
 		order.setDate(neworder.getDate());
 		order.setEnUU(SystemSession.getUser().getEnterprise().getUu());

+ 1 - 0
src/main/java/com/uas/platform/b2b/service/impl/CartServiceImpl.java

@@ -75,6 +75,7 @@ public class CartServiceImpl implements CartService {
 	public ModelMap addToOrder(Long id) {
 		ModelMap map = new ModelMap();
 		PurchaseOrderAll purcOrder = purchaseOrderAllDao.findOne(id);
+		purcOrder.setSource("B2B");
 		purcOrder.setType("平台采购");
 		purcOrder.setSendStatus((short) Status.NOT_UPLOAD.value());
 		purcOrder.setStatus((short) Status.NOT_REPLY.value());

+ 267 - 0
src/main/java/com/uas/platform/b2b/service/impl/PurcOrderChangeServiceImpl.java

@@ -0,0 +1,267 @@
+package com.uas.platform.b2b.service.impl;
+
+import com.uas.platform.b2b.core.util.ContextUtils;
+import com.uas.platform.b2b.dao.*;
+import com.uas.platform.b2b.event.PurchaseOrderChangeSaveReleaseEvent;
+import com.uas.platform.b2b.model.*;
+import com.uas.platform.b2b.service.PurcOrderChangeService;
+import com.uas.platform.b2b.support.SPageUtils;
+import com.uas.platform.b2b.support.SystemSession;
+import com.uas.platform.b2b.support.XingePusher;
+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.CriterionExpression;
+import com.uas.platform.core.persistence.criteria.LogicalExpression;
+import com.uas.platform.core.persistence.criteria.PredicateUtils;
+import com.uas.platform.core.persistence.criteria.SimpleExpression;
+import com.uas.search.b2b.model.SPage;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.security.access.method.P;
+import org.springframework.stereotype.Service;
+import org.springframework.ui.ModelMap;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import javax.persistence.criteria.*;
+import java.util.*;
+
+/**
+ * 采购变更单
+ *
+ * Created by hejq on 2018-06-22.
+ */
+@Service
+public class PurcOrderChangeServiceImpl implements PurcOrderChangeService {
+
+    @Autowired
+    private PurchaseOrderChangeDao changeDao;
+
+    @Autowired
+    private PurchaseOrderChangeItemDao changeItemDao;
+
+    @Autowired
+    private PurchaseOrderInfoDao orderInfoDao;
+
+    @Autowired
+    private PurcOrderInfoItemDao orderInfoItemDao;
+
+    @Autowired
+    private PurchaseOrderAllDao purchaseOrderAllDao;
+
+    @Autowired
+    private EnterpriseDao enterpriseDao;
+
+    @Autowired
+    private  UserDao userDao;
+
+    /**
+     * 查询符合条件的能变更的采购单
+     *
+     * @param pageInfo  分页信息
+     * @param filter 过滤条件
+     * @return
+     */
+    @Override
+    public SPage<PurchaseOrderAll> findEnableToChange(final PageInfo pageInfo, final SearchFilter filter) {
+        if (filter != null) {
+            if (filter.getFromDate() != null) {
+                pageInfo.expression(PredicateUtils.gte("date", new Date(filter.getFromDate()), false));
+            }
+            if (filter.getEndDate() != null) {
+                pageInfo.expression(PredicateUtils.lte("date", new Date(filter.getEndDate()), false));
+            }
+            if (!StringUtils.isEmpty(filter.getKeyword())) {
+                SimpleExpression vendName = new SimpleExpression("receiveName", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
+                SimpleExpression orderCode = new SimpleExpression("code", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
+                SimpleExpression[] expressions = new SimpleExpression[]{vendName, orderCode};
+                LogicalExpression logical = new LogicalExpression(expressions, CriterionExpression.Operator.OR);
+                pageInfo.expression(logical);
+            }
+        }
+        pageInfo.expression(PredicateUtils.isNull("erpId"));
+        pageInfo.expression(PredicateUtils.ne("status",Status.UNAUDIT.value(),false));
+        Page<PurchaseOrderAll> pageOrders = purchaseOrderAllDao.findAll(new Specification<PurchaseOrderAll>() {
+            @Override
+            public Predicate toPredicate(Root<PurchaseOrderAll> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
+//                Predicate[] predicates = pageInfo.getPredicates(root, query, builder);
+//                if( filter != null) {
+//                    predicates = Arrays.copyOf(predicates, predicates.length + 1);
+//                    SetJoin<PurchaseOrderAll,PurchaseOrderAllItem> join =
+//                            root.join(root.getModel().getSet("orderItems",PurchaseOrderAllItem.class),JoinType.LEFT);
+//                    Predicate p = builder.notEqual(join.get("puid").as(Long.class),963977);
+//                    predicates[predicates.length-1] = p;
+//                }
+                return query.where(pageInfo.getPredicates(root, query, builder)).getRestriction();
+            }
+        }, pageInfo);
+        return SPageUtils.covertSPage(pageOrders);
+    }
+
+    /**
+     * 过滤变更明细
+     *
+     * @param sPage 分页数据
+     * @return
+     */
+    @Override
+    public SPage<PurchaseOrderAll> filterChangeItem(SPage<PurchaseOrderAll> sPage) {
+        for (PurchaseOrderAll orderAll : sPage.getContent()) {
+            Set<PurchaseOrderAllItem> orderAllItems = orderAll.getOrderItems();
+            List<PurchaseOrderChange> orderChanges = changeDao.findByOrderId(orderAll.getId());
+            Set<Long> set = new HashSet<>();
+            if (!CollectionUtils.isEmpty(orderChanges)) {
+                Iterator<PurchaseOrderChange> changeIterator = orderChanges.iterator();
+                while (changeIterator.hasNext()) {
+                    PurchaseOrderChange orderChange = changeIterator.next();
+                    Set<PurchaseOrderChangeItem> changeItems = orderChange.getOrderChangeItems();
+                    for (PurchaseOrderChangeItem changeItem : changeItems) {
+                        set.add(changeItem.getOrderItemId());
+                    }
+                }
+            }
+            for(PurchaseOrderAllItem orderAllItem :orderAllItems) {
+                if (set.contains(orderAllItem.getId())) {
+                    orderAllItem.setChange(true);
+                }
+            }
+        }
+        return sPage;
+    }
+
+    /**
+     * 新增采购变更单
+     *
+     * @param change 采购变更单信息
+     * @return
+     */
+    @Override
+    public ModelMap save(PurchaseOrderChange change) {
+        change.setBackStatus((short) Status.NOT_UPLOAD.value());
+        change.setReplySendStatus((short) Status.NOT_UPLOAD.value());
+        change.setEnUU(SystemSession.getUser().getEnterprise().getUu());
+        change.setUserUU(SystemSession.getUser().getUserUU());
+        change.setSendStatus((short) Status.NOT_UPLOAD.value());
+        change.setStatus((short)Status.NOT_REPLY.value());
+        //判断付款方式,币种等是否改变
+        if (StringUtils.isEmpty(change.getNewCurrency()) || change.getNewCurrency().equals(change.getOldCurrency())) {
+            change.setNewCurrency(null);
+        }
+        if (StringUtils.isEmpty(change.getNewPayments()) || change.getNewPayments().equals(change.getOldPayments())) {
+            change.setNewPayments(null);
+        }
+        if (!CollectionUtils.isEmpty(change.getOrderChangeItems())) {
+            StringBuffer stringBuffer = new StringBuffer();
+            Set<PurchaseOrderChangeItem> itemList = change.getOrderChangeItems();
+            Iterator<PurchaseOrderChangeItem> itemIterator = itemList.iterator();
+            while (itemIterator.hasNext()) {
+                PurchaseOrderChangeItem item = itemIterator.next();
+                item.setOrderChange(change);
+                if ((!item.getNewPrice().equals(item.getOldPrice())) || (!item.getNewQty().equals(item.getOldQty()))
+                        || (StringUtils.isEmpty(item.getNewDelivery()) || !item.getNewDelivery().equals(item.getOldDelivery())) || (!item.getNewTaxrate().equals(item.getOldTaxrate()))) {
+                    stringBuffer.append("行"+item.getOrderItemNumber()+":");
+                    if (!item.getNewPrice().equals(item.getOldPrice())) {
+                        stringBuffer.append("单价"+".");
+                    }
+                    if (!item.getNewQty().equals(item.getOldQty())) {
+                        stringBuffer.append("数量"+".");
+                    }
+                    if (StringUtils.isEmpty(item.getNewDelivery()) || !item.getNewDelivery().equals(item.getOldDelivery())) {
+                        stringBuffer.append("交货日期"+".");
+                    }
+                    if (!item.getNewTaxrate().equals(item.getOldTaxrate())) {
+                        stringBuffer.append("税率"+".");
+                    }
+                }
+                //判断单价、数量等是否变更,如不变更,将新单价等设为空
+                if ((item.getNewPrice().equals(item.getOldPrice())) || (item.getNewQty().equals(item.getOldQty()))
+                        || (StringUtils.isEmpty(item.getNewDelivery()) || item.getNewDelivery().equals(item.getOldDelivery())) || (item.getNewTaxrate().equals(item.getOldTaxrate()))) {
+                    if (item.getNewPrice().equals(item.getOldPrice())) {
+                        item.setNewPrice(null);
+                    }
+                    if (item.getNewQty().equals(item.getOldQty())) {
+                        item.setNewQty(null);
+                    }
+                    if (StringUtils.isEmpty(item.getNewDelivery()) || item.getNewDelivery().equals(item.getOldDelivery())) {
+                        item.setNewDelivery(null);
+                    }
+                    if (item.getNewTaxrate().equals(item.getOldTaxrate())) {
+                        item.setNewTaxrate(null);
+                    }
+                }
+            }
+            if (!StringUtils.isEmpty(stringBuffer)) {
+                change.setDescription(stringBuffer.toString());
+            }
+        }
+       List<PurchaseOrderChangeItem> items = changeItemDao.save(change.getOrderChangeItems());
+       if (change.getUnNeedReply() == 1) {
+           PurchaseOrderInfo orderInfo = orderInfoDao.findOne(change.getOrderId());
+           if (!StringUtils.isEmpty(change.getNewPayments())) {
+               orderInfo.setPayments(change.getNewPayments());
+           }
+           if (!StringUtils.isEmpty(change.getNewCurrency())) {
+               orderInfo.setCurrency(change.getNewCurrency());
+           }
+           if (!StringUtils.isEmpty(change.getNewRate())) {
+               orderInfo.setRate(change.getNewRate());
+           }
+           orderInfoDao.save(orderInfo);
+           Set<PurchaseOrderChangeItem> itemList = change.getOrderChangeItems();
+           //orderInfoItemDao.save(itemList);
+           Iterator<PurchaseOrderChangeItem> changeItemIterator = itemList.iterator();
+           while (changeItemIterator.hasNext()) {
+               PurchaseOrderChangeItem changeItem = changeItemIterator.next();
+               PurcOrderInfoItem orderInfoItem = orderInfoItemDao.findOne(changeItem.getOrderItemId());
+               if (!StringUtils.isEmpty(changeItem.getNewQty())) {
+                   orderInfoItem.setQty(changeItem.getNewQty());
+               }
+               if (!StringUtils.isEmpty(changeItem.getNewTaxrate())) {
+                   orderInfoItem.setTaxrate(changeItem.getNewTaxrate());
+               }
+               if (!StringUtils.isEmpty(changeItem.getNewDelivery())) {
+                   orderInfoItem.setDelivery(changeItem.getNewDelivery());
+               }
+               if (!StringUtils.isEmpty(changeItem.getNewPrice())) {
+                   orderInfoItem.setPrice(changeItem.getNewPrice());
+               }
+               orderInfoItemDao.save(orderInfoItem);
+           }
+           //无需更改的采购变更单无需再次传到ERP
+           //change.setStatus((short)Status.REPLIED.value());
+           change.setReplySendStatus((short)Status.DOWNLOADED.value());
+           changeDao.save(change);
+       }
+
+        return new ModelMap("id", items.get(0).getOrderChange().getId());
+    }
+
+    /**
+     * 通过分页信息查询采购变更单
+     *
+     * @param pageInfo 分页信息
+     * @param filter   过滤条件
+     * @return
+     */
+    @Override
+    public Page<PurchaseOrderChange> findByPageInfo(final PageInfo pageInfo, SearchFilter filter) {
+        if (filter != null) {
+            if (filter.getFromDate() != null) {
+                pageInfo.expression(PredicateUtils.gte("date", new Date(filter.getFromDate()), false));
+            }
+            if (filter.getEndDate() != null) {
+                pageInfo.expression(PredicateUtils.lte("date", new Date(filter.getEndDate()), false));
+            }
+        }
+        return changeDao.findAll(new Specification<PurchaseOrderChange>() {
+            public Predicate toPredicate(Root<PurchaseOrderChange> root, CriteriaQuery<?> query,
+                                         CriteriaBuilder builder) {
+                return query.where(pageInfo.getPredicates(root, query, builder)).getRestriction();
+            }
+        }, pageInfo);
+    }
+
+
+}

+ 40 - 0
src/main/java/com/uas/platform/b2b/service/impl/PurchaseOrderChangeServiceImpl.java

@@ -71,6 +71,12 @@ public class PurchaseOrderChangeServiceImpl implements PurchaseOrderChangeServic
 	@Autowired
 	private VendorDao vendorDao;
 
+	@Autowired
+	private PurchaseOrderInfoDao purchaseOrderInfoDao;
+
+	@Autowired
+	private PurcOrderInfoItemDao purcOrderInfoItemDao;
+
 	@Override
 	public void save(List<PurchaseOrderChangeItem> changeItems) {
 		changeItems = purchaseOrderChangeItemDao.save(changeItems);
@@ -388,6 +394,40 @@ public class PurchaseOrderChangeServiceImpl implements PurchaseOrderChangeServic
 						"供应商:" + vendor.getEnName(), "", "");
 			}
 		}
+		if (orderChange.getAgreed() == 1) {
+			PurchaseOrderInfo orderInfo = purchaseOrderInfoDao.findOne(orderChange.getOrderId());
+			if (!StringUtils.isEmpty(orderInfo)) {
+				if (!StringUtils.isEmpty(change.getNewPayments())) {
+					orderInfo.setPayments(change.getNewPayments());
+				}
+				if (!StringUtils.isEmpty(change.getNewCurrency())) {
+					orderInfo.setCurrency(change.getNewCurrency());
+				}
+				if (!StringUtils.isEmpty(change.getNewRate())) {
+					orderInfo.setRate(change.getNewRate());
+				}
+				purchaseOrderInfoDao.save(orderInfo);
+				Set<PurchaseOrderChangeItem> itemList = orderChange.getOrderChangeItems();
+				Iterator<PurchaseOrderChangeItem> changeItemIterator = itemList.iterator();
+				while (changeItemIterator.hasNext()) {
+					PurchaseOrderChangeItem changeItem = changeItemIterator.next();
+					PurcOrderInfoItem orderInfoItem = purcOrderInfoItemDao.findOne(changeItem.getOrderItemId());
+					if (!StringUtils.isEmpty(changeItem.getNewQty())) {
+						orderInfoItem.setQty(changeItem.getNewQty());
+					}
+					if (!StringUtils.isEmpty(changeItem.getNewTaxrate())) {
+						orderInfoItem.setTaxrate(changeItem.getNewTaxrate());
+					}
+					if (!StringUtils.isEmpty(changeItem.getNewPrice())) {
+						orderInfoItem.setPrice(changeItem.getNewPrice());
+					}
+					if (!StringUtils.isEmpty(changeItem.getNewDelivery())) {
+						orderInfoItem.setDelivery(changeItem.getNewDelivery());
+					}
+					purcOrderInfoItemDao.save(orderInfoItem);
+				}
+			}
+		}
 		return orderChange;
 	}
 

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

@@ -2,14 +2,12 @@ package com.uas.platform.b2b.service.impl;
 
 import com.uas.platform.b2b.core.util.ContextUtils;
 import com.uas.platform.b2b.core.util.SplitArray;
-import com.uas.platform.b2b.core.util.StringUtil;
 import com.uas.platform.b2b.core.util.ThreadTask;
 import com.uas.platform.b2b.dao.*;
 import com.uas.platform.b2b.event.PurchaseOrderEndReleaseEvent;
 import com.uas.platform.b2b.event.PurchaseOrderReplyReleaseEvent;
 import com.uas.platform.b2b.event.PurchaseOrderSaveReleaseEvent;
 import com.uas.platform.b2b.model.*;
-import com.uas.platform.b2b.ps.ProductUtils;
 import com.uas.platform.b2b.ps.service.PersonalProductService;
 import com.uas.platform.b2b.service.PurchaseOrderService;
 import com.uas.platform.b2b.support.SPageUtils;
@@ -95,16 +93,9 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
 	@Autowired
 	private DistributeDao distributeDao;
 
-	@Autowired
-    private CommonDao commonDao;
-
 	@Autowired
     private PersonalProductService personalProductService;
 
-	@Autowired
-	private ProductTempDao productTempDao;
-
-
 	@Override
 	public void save(List<PurcOrderInfoItem> orderItems) {
 	 	orderItems = purcOrderInfoItemDao.save(orderItems);
@@ -488,12 +479,6 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
 				(short) Status.NOT_REPLY.value());
 	}
 
-	@Override
-	public int getPurcOnhandCount() {
-		return purchaseOrderDao.getPurcCountByEnUUAndStatus(SystemSession.getUser().getEnterprise().getUu(),
-				(short) Status.NOT_REPLY.value());
-	}
-
 	@Override
 	public Page<PurchaseOrderTodo> findTodoByPageInfo(final PageInfo pageInfo, SearchFilter filter) {
 		if (filter != null) {
@@ -710,11 +695,6 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
 		return purchaseOrderAllItemDao.findOrderItemCountByEnUU(uu);
 	}
 
-	@Override
-	public long getPurcByenUUAdnStatus(Long uu) {
-		return purchaseOrderDao.getPurcCounByEnUU(uu);
-	}
-
 	@Override
 	public List<PrintLog> findPrintNotUploadReply() {
 		return printLogDao.findByEnUUAndStatusAndTable(SystemSession.getUser().getEnterprise().getUu(), Constant.NO,"purc$orders");
@@ -733,21 +713,6 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
 		}
 	}
 
-	@Override
-	public Page<PurchaseOrder> findAllOrdersByPageInfo(final PageInfo pageInfo, final SearchFilter filter) {
-		if (filter != null) {
-			if (!CollectionUtils.isEmpty(filter.getDistribute()))
-				pageInfo.expression(PredicateUtils.in("enUU", filter.getDistribute(), false));
-		}
-		return purchaseOrderDao.findAll(new Specification<PurchaseOrder>() {
-			@Override
-			public Predicate toPredicate(Root<PurchaseOrder> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
-				query.where(pageInfo.getPredicates(root, query, builder));
-				return null;
-			}
-		}, pageInfo);
-	}
-
 	@Override
 	public Page<PurchaseOrderAll> findAllOrdersDetailByPageInfo(final PageInfo pageInfo, final SearchFilter filter) {
 		if (filter != null) {
@@ -784,60 +749,6 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
 		return pageOrders;
 	}
 
-	@Override
-	public Page<PurchaseOrderTodo> findTodoOrdersByPageInfo(final PageInfo pageInfo, final SearchFilter filter) {
-		if (filter != null) {
-			if (filter.getFromDate() != null) {
-				pageInfo.expression(PredicateUtils.gte("date", new Date(filter.getFromDate()), false));
-			}
-			if (filter.getEndDate() != null) {
-				pageInfo.expression(PredicateUtils.lte("date", new Date(filter.getEndDate()), false));
-			}
-		}
-		Page<PurchaseOrderTodo> pageOrders = purchaseOrderTodoDao.findAll(new Specification<PurchaseOrderTodo>() {
-			@Override
-			public Predicate toPredicate(Root<PurchaseOrderTodo> root, CriteriaQuery<?> query,
-					CriteriaBuilder builder) {
-				return query.where(pageInfo.getPredicates(root, query, builder)).getRestriction();
-			}
-		}, pageInfo);
-		List<PurchaseOrderTodo> orders = pageOrders.getContent();
-		for (PurchaseOrderTodo order : orders) {
-			Enterprise enter = enterpriseDao.findEnterpriseByUu(order.getVendUU());
-			if (enter != null) {
-				order.setEnName(enter.getEnName());
-			}
-		}
-		return pageOrders;
-	}
-
-	@Override
-	public Page<PurchaseOrderDone> findDoneOrdersByPageInfo(final PageInfo pageInfo, final SearchFilter filter) {
-		if (filter != null) {
-			if (filter.getFromDate() != null) {
-				pageInfo.expression(PredicateUtils.gte("date", new Date(filter.getFromDate()), false));
-			}
-			if (filter.getEndDate() != null) {
-				pageInfo.expression(PredicateUtils.lte("date", new Date(filter.getEndDate()), false));
-			}
-		}
-		Page<PurchaseOrderDone> pageOrders = purchaseOrderDoneDao.findAll(new Specification<PurchaseOrderDone>() {
-			@Override
-			public Predicate toPredicate(Root<PurchaseOrderDone> root, CriteriaQuery<?> query,
-					CriteriaBuilder builder) {
-				return query.where(pageInfo.getPredicates(root, query, builder)).getRestriction();
-			}
-		}, pageInfo);
-		List<PurchaseOrderDone> orders = pageOrders.getContent();
-		for (PurchaseOrderDone order : orders) {
-			Enterprise enter = enterpriseDao.findEnterpriseByUu(order.getVendUU());
-			if (enter != null) {
-				order.setEnName(enter.getEnName());
-			}
-		}
-		return pageOrders;
-	}
-
 	@Override
 	public Page<PurchaseOrderEnd> findEndOrdersByPageInfo(final PageInfo pageInfo, final SearchFilter filter) {
 		if (filter != null) {
@@ -864,37 +775,6 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
 		return pageOrders;
 	}
 
-	@Override
-	public Page<PurchaseOrderWaiting> findWaitingOrdersByPageInfo(final PageInfo pageInfo, final SearchFilter filter) {
-		if (filter != null) {
-			if (filter.getFromDate() != null) {
-				pageInfo.expression(PredicateUtils.gte("date", new Date(filter.getFromDate()), false));
-			}
-			if (filter.getEndDate() != null) {
-				pageInfo.expression(PredicateUtils.lte("date", new Date(filter.getEndDate()), false));
-			}
-			if (!CollectionUtils.isEmpty(filter.getDistribute())) {
-				pageInfo.expression(PredicateUtils.in("enUU", filter.getDistribute(), false));
-			}
-		}
-		Page<PurchaseOrderWaiting> pageOrders = purchaseOrderWaitingDao
-				.findAll(new Specification<PurchaseOrderWaiting>() {
-					@Override
-					public Predicate toPredicate(Root<PurchaseOrderWaiting> root, CriteriaQuery<?> query,
-							CriteriaBuilder builder) {
-						return query.where(pageInfo.getPredicates(root, query, builder)).getRestriction();
-					}
-				}, pageInfo);
-		List<PurchaseOrderWaiting> orders = pageOrders.getContent();
-		for (PurchaseOrderWaiting order : orders) {
-			Enterprise enter = enterpriseDao.findEnterpriseByUu(order.getVendUU());
-			if (enter != null) {
-				order.setEnName(enter.getEnName());
-			}
-		}
-		return pageOrders;
-	}
-
 	@Override
 	public SPage<PurchaseOrderAll> findOrdersByPageInfo(PageInfo pageInfo, SearchFilter filter) {
 		return SPageUtils.covertSPage(findAllOrdersDetailByPageInfo(pageInfo, filter));
@@ -975,7 +855,7 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
         purchaseOrderItemDao.replyByBatch(idString, username, userip, enuu, useruu, !StringUtils.isEmpty(date) ? date : 0);
     }
 
-    @Override
+	@Override
 	@Transactional
 	public Integer setReadByState(String category) {
 		List<Long> unreadIds = getUnreadIds(category);
@@ -1003,63 +883,6 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
 		return deleteCount;
 	}
 
-	/**
-	 * 根据企业UU批量处理采购单明细中的物料转入供应商报价人个人物料
-	 *
-	 * @param enUU 采购方企业UU
-	 */
-	@Override
-	public void coverPurchaseOrderItemProdToUser(Long enUU) throws Exception {
-		String importId = StringUtil.getRandomNumber(8);
-		int size = 1000;
-		int page = 1;
-		String countSql = "select count(1) from (select pd_prid,pu_venduu,pu_venduseruu,count(1) from purc$orderitems " +
-				"left join purc$orders on pd_puid = pu_id where pu_venduseruu is not null and pu_enuu = "  + enUU + " group by pd_prid,pu_venduseruu,pu_venduu) a";
-		Integer count = commonDao.queryForObject(countSql, Integer.class);
-		for (; page <= Math.ceil((double)count / (double)size); page++ ) {
-			String sql = "select " + importId + " as pr_import_id, pr_title,pr_code,pr_spec,pr_unit,pr_minpack,pr_minorder,pr_leadtime,pr_ltinstock,pr_brand,pr_cmpcode,'B2B' as pr_sourceapp,pd_prid as pr_sourceid,1 as pr_issale,0 as pr_ispurchase," +
-					"pr_isshow,pr_ispubsale,pr_standard,pr_create_time,pu_venduu as pr_enuu,pu_venduseruu as pr_useruu from (" +
-					" select pd_prid,pu_venduu,pu_venduseruu,count(1) as nums from purc$orderitems left join purc$orders on pd_puid = pu_id " +
-					" where pu_venduseruu is not null and pu_enuu = " + enUU + " group by pd_prid,pu_venduseruu,pu_venduu order by count(1) desc " +
-					" ) t left join v$products P on pd_prid = pr_id where P.pr_title is not null and P.pr_code is not null limit "+ size * (page - 1)+ ", "+ (page * size-size * (page - 1)) ;
-			List<ProductTemp> productTemps = commonDao.query(sql, ProductTemp.class);
-			// 本地校验
-			checkTempProducts(productTemps);
-			// 保存到公共库
-			saveToDataCenter(productTemps);
-		}
-	}
-
-	/**
-	 * 校验导入的物料
-	 *
-	 * @param temps
-	 */
-	private void checkTempProducts(List<ProductTemp> temps) {
-		if (!CollectionUtils.isEmpty(temps)) {
-			String importId = temps.get(0).getPr_import_id();
-			// 放入数据库
-			productTempDao.save(temps);
-			// 匹配已存在物料
-			productTempDao.matchExists(importId);
-			// 已禁用物料自动解禁
-			productTempDao.toggleDisabled(importId);
-		}
-	}
-
-	/**
-	 * 保存到公共库
-	 */
-	private void saveToDataCenter(List<ProductTemp> temps) throws Exception {
-		if (!CollectionUtils.isEmpty(temps)) {
-			String importId = temps.get(0).getPr_import_id();
-			// 已匹配+未匹配到的物料
-			List<Product> products = productTempDao.getProducts(importId);
-			// 更新物料并插入个人物料
-			ProductUtils.paginationUpdateAndAddToProductUser(products);
-		}
-	}
-
     /**
      * 获取明细最后一次回复数量
      *

BIN
src/main/resources/jxls-tpl/sale/purcChange.xls


+ 1 - 1
src/main/webapp/WEB-INF/web.xml

@@ -8,7 +8,7 @@
 	<description>usoftchina platform b2b</description>
 	<context-param>
 		<param-name>webAppRootKey</param-name>
-		<param-value>spring.webapp.root_scm</param-value>
+		<param-value>spring1.webapp.root_scm</param-value>
 	</context-param>
 	<context-param>
 		<param-name>spring.profiles.active</param-name>

+ 426 - 4
src/main/webapp/resources/js/index/app.js

@@ -1,6 +1,6 @@
-define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives', 'service/Purc', 'service/Make', 'service/Fa', 'service/Account', 'service/Alert', 'service/CheckTel', 'ui.router', 'ui.bootstrap', 'file-upload', 'ngSanitize', 'service/BaseInfo', 'service/Cart', 'service/ApprovalFlow', 'service/DeputyOrder', 'service/Product', 'service/Token', 'service/ProductUsers', 'service/File', 'service/PublicInquiry', 'service/Customer'], function () {
+define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives', 'service/Purc', 'service/Make', 'service/Fa', 'service/Account', 'service/Alert', 'service/CheckTel', 'ui.router', 'ui.bootstrap', 'file-upload', 'ngSanitize', 'service/BaseInfo', 'service/Cart', 'service/ApprovalFlow', 'service/DeputyOrder', 'service/Product', 'service/Token', 'service/ProductUsers', 'service/File', 'service/PublicInquiry', 'service/Customer', 'service/PurcChange'], function () {
     'use strict';
-    var app = angular.module('myApp', ['toaster', 'angularCharts', 'ngTable', 'ui.router', 'common.services', 'common.directives', 'PurcServices', 'MakeServices', 'FaServices', 'AccountServices', 'AlertServices', 'ui.bootstrap', 'angularFileUpload', 'ngSanitize', 'CheckTelModule', 'ProductServices', 'CartServices', 'ApprvoalFlowService', 'DeputyOrderService', 'ProductInfoServices', 'TokenService', 'ProductUserService', 'ui.tour', 'FileService', 'publicInquiryService', 'CustomerService']);
+    var app = angular.module('myApp', ['toaster', 'angularCharts', 'ngTable', 'ui.router', 'common.services', 'common.directives', 'PurcServices', 'MakeServices', 'FaServices', 'AccountServices', 'AlertServices', 'ui.bootstrap', 'angularFileUpload', 'ngSanitize', 'CheckTelModule', 'ProductServices', 'CartServices', 'ApprvoalFlowService', 'DeputyOrderService', 'ProductInfoServices', 'TokenService', 'ProductUserService', 'ui.tour', 'FileService', 'publicInquiryService', 'CustomerService', 'changeService']);
     app.init = function () {
         angular.bootstrap(document, ['myApp']);
     };
@@ -128,6 +128,19 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
             url: "/deputy/:id",
             templateUrl: "static/tpl/index/purc/deputyOrder_detail.html",
             controller: 'DeputyOrderDetailCtrl'
+        }).state('purc.changeList', {// 新增采购变更单
+            url: "/change",
+            templateUrl: "static/tpl/index/purc/changeList.html",
+            controller: 'PurcChangeListCtrl'
+            /* 采购变更单详情 */
+        }).state('purc.change_detail', {
+            url: "/change/:id",
+            templateUrl: "static/tpl/index/purc/change_detail.html",
+            controller: 'PurcChangeDetailCtrl'
+        }).state('purc.changeNew', {// 新增采购变更单
+            url: "/change_new",
+            templateUrl: "static/tpl/index/purc/change_new.html",
+            controller: 'PurcChangeNewCtrl'
             /* 招标列表 */
         }).state('purc.tenderlist', {
             url: "/tender",
@@ -3487,7 +3500,6 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
             $scope.$dateOpen = !openParam;
         };
 
-
         // 取消
         $scope.cancel = function () {
             $modalInstance.dismiss();
@@ -23931,6 +23943,416 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
         }
 
     }]);
-    
+
+    /**
+     * 采购变更单列表
+     * 
+     * @author hejq
+     * @date 2018-06-25 17:13
+     */
+    app.controller('PurcChangeListCtrl', ['$scope', '$filter', 'change', 'ngTableParams', 'toaster', 'BaseService', 'CurrentRole', function ($scope, $filter, change, ngTableParams, toaster, BaseService, CurrentRole) {
+        BaseService.scrollBackToTop();
+
+        $scope.active = 'todo';
+        $scope.agreedText = '全部';
+        $scope.dateZoneText = '一个月内';
+        $scope.condition = {dateZone: 1};
+
+        /* 时间筛选初始化*/
+        var fromDate = new Date();
+        var toDate = new Date();
+        fromDate.setMonth(fromDate.getMonth() - 1);
+        fromDate.setHours(0, 0, 0, 0);
+        toDate.setHours(23, 59, 59, 999);
+        $scope.condition.dateFrom = fromDate;
+        $scope.condition.dateTo = toDate;
+
+        $scope.changeAgreed = function (agreed) {
+            $scope.condition.agreed = agreed;
+            $scope.agreedText = typeof agreed == 'undefined' ? '全部' : (agreed == 1 ? '已同意' : '不同意');
+            $scope.condition.$agreedOpen = false;
+        };
+        $scope.changeDateZone = function (zone) {
+            $scope.condition.dateZone = zone;
+            $scope.dateZoneText = zone == 1 ? '最近一个月' : (zone == 3 ? '最近三个月' : (zone == 6 ? '最近六个月' : '自定义'));
+            $scope.condition.$dateZoneOpen = false;
+            getDateCondition(zone, $scope.condition);
+            $scope.tableParams.page(1);
+            $scope.tableParams.reload();
+        };
+        $scope.setActive = function (state) {
+            if ($scope.active != state) {
+                $scope.active = state;
+                if ($scope.tableParams.page() == 1)
+                    $scope.tableParams.reload();
+                else
+                    $scope.tableParams.page(1);
+            }
+        };
+
+        var getService = function () {
+            return change;
+        };
+        $scope.tableParams = new ngTableParams({
+            page: 1,
+            count: 20,
+            sorting: {
+                date: 'desc'
+            }
+        }, {
+            total: 0,
+            counts: [5, 10, 25, 50],
+            getData: function ($defer, params) {
+                $scope.loading = true;
+                var pageParams = params.url();
+                pageParams.searchFilter = {
+                    keyword: $scope.keyword,
+                    fromDate: getDateTime($scope.condition.dateFrom),
+                    endDate: getDateTime($scope.condition.dateTo)
+                };
+                getService()[getState($scope.active)].call(null, BaseService.parseParams(pageParams), function (page) {
+                    $scope.loading = false;
+                    if (page) {
+                        params.total(page.totalElement);
+                        $defer.resolve(page.content);
+                        $scope.searchFilterXls = angular.copy(pageParams.searchFilter);//保存当前取值的关键词
+                    }
+                }, function (response) {
+                    $scope.loading = false;
+                    toaster.pop('error', '数据加载失败', response.data);
+                });
+            }
+        });
+
+        $scope.openDatePicker = function ($event, item, openParam) {
+            $event.preventDefault();
+            $event.stopPropagation();
+            item[openParam] = !item[openParam];
+        };
+
+        $scope.openFilterDatePicker = function ($event, item, openParam) {
+            $event.preventDefault();
+            $event.stopPropagation();
+            item[openParam] = !item[openParam];
+            if ($scope.condition.dateFrom && $scope.condition.dateTo && !item[openParam]) {
+                $scope.tableParams.reload();
+            }
+        };
+
+        // 搜索框回车
+        $scope.onSearch = function (keyword) {
+            $scope.tableParams.page(1);
+            $scope.tableParams.reload();
+        };
+
+        // 导出
+        $scope.exportXls = function () {
+            change.exportXls({}, {}, function (data) {
+                if (data.success){
+                    window.location.href = 'purc/change/xls?_state='+$scope.active+'&searchFilter='+encodeURIComponent(angular.toJson($scope.searchFilterXls));
+                }
+            }, function (response) {
+                toaster.pop('error', '数据加载失败', response.data);
+            });
+        }
+    }]);
+
+    /**
+     * 新增采购变更单
+     * 
+     * @author hejq
+     * @date 2018-06-25 16:38
+     */
+    app.controller('PurcChangeNewCtrl', ['$scope', 'toaster', 'BaseService', 'AuthenticationService', '$modal', '$filter', 'change',
+        function ($scope, toaster, BaseService, AuthenticationService, $modal, $filter, change) {
+        // 获取登录人员信息
+        AuthenticationService.getAuthentication().success(function (data) {
+            $scope.user = data;
+            initChange();
+        });
+
+        // 初始化变更单信息
+        var initChange = function () {
+            $scope.change = {
+                date: new Date(),
+                recorder: $scope.user.userName,
+                orderCode: null,
+                code: 'B2BPC' + $filter('date')(new Date(), 'yyMMddHHmmss_sss'),
+                orderId: null,
+                orderChangeItems: []
+            }
+        }
+        $scope.getEnableOrders = function() {
+            initChange();
+            var modalInstance = $modal.open({
+                animation: true,
+                size: 'lg',
+                templateUrl: 'static/tpl/index/purc/modal/enableOrderList.html',
+                controller: 'EnableChangeListCtrl',
+                resolve: {
+                }
+            });
+            modalInstance.result.then(function (data) {
+                $scope.change.orderCode = data.code;
+                $scope.change.orderId = data.id;
+                $scope.orderItems = data.orderItems;
+                $scope.change.oldCurrency = data.currency;
+                $scope.change.oldPayments = data.payments;
+                $scope.change.oldRate = data.rate;
+                $scope.change.vendUU = data.vendUU;
+                $scope.change.apVendorName = data.receiveName;
+                $scope.change.vendUserUU = data.vendUserUU;
+                $scope.change.newCurrency = data.currency != null ? data.currency :null;
+                $scope.change.newPayments = data.payments != null ? data.payments :null;
+                angular.forEach($scope.orderItems, function (item, index) {
+                    $scope.change.orderChangeItems.push({
+                        oldProductId: item.productId,
+                        orderItemId: item.id,
+                        orderItemNumber: item.number,
+                        oldQty: item.qty,
+                        oldPrice: item.price,
+                        oldTaxrate: item.taxrate,
+                        oldDelivery: item.delivery,
+                        newQty: item.qty != null ? item.qty :null,
+                        newPrice: item.price != null ? item.price :null,
+                        newTaxrate: item.taxrate != null ? item.taxrate :null,
+                        newDelivery: item.delivery != null ? item.delivery :null,
+                        oldProduct: item.product,
+                        number: index + 1
+                    });
+                });
+            });
+        }
+
+        // 删除明细
+        $scope.del = function (index) {
+            $scope.change.orderChangeItems.splice(index, 1);
+        }
+
+        $scope.getMinDate = function () {
+            return $filter('date')(new Date, 'yyyy-MM-dd');
+        };
+
+        $scope.openDatePicker = function ($event, openParam, index) {
+            $event.preventDefault();
+            $event.stopPropagation();
+            $scope.change.orderChangeItems[index].$dateOpen = !openParam;
+        };
+
+        $scope.save = function() {
+            if ($scope.change.unNeedReply == null) {
+                toaster.pop('error', '请选择是否需要供应商确认');
+            } else if ($scope.change.orderChangeItems.length == 0) {
+                toaster.pop('error', '请至少选择一条采购明细')
+            } else {
+                change.save({}, $scope.change, function (data) {
+                    window.location.hash = "/purc/change/" + data.id;
+                    toaster.pop('success', '采购变更单保存成功');
+                }, function(res) {
+                    toaster.pop('error','请输入正确的信息')
+                });
+            }
+        }
+    }]);
+
+    /**
+     * 获取可以作为采购变更单的采购单
+     *
+     * @author hejq
+     * @date 2018-06-25 18:41
+     */
+    app.controller('EnableChangeListCtrl', ['$scope', 'change', 'BaseService', 'ngTableParams', 'toaster', '$modalInstance',
+        function ($scope, change, BaseService, ngTableParams, toaster, $modalInstance) {
+
+            $scope.dateZoneText = '一个月内';
+            $scope.condition = {dateZone: 1};
+
+            /* 时间筛选初始化*/
+            var fromDate = new Date();
+            var toDate = new Date();
+            fromDate.setMonth(fromDate.getMonth() - 1);
+            fromDate.setHours(0, 0, 0, 0);
+            toDate.setHours(23, 59, 59, 999);
+            $scope.condition.dateFrom = fromDate;
+            $scope.condition.dateTo = toDate;
+
+            $scope.changeDateZone = function (zone) {
+                $scope.condition.dateZone = zone;
+                $scope.dateZoneText = zone == 1 ? '最近一个月' : (zone == 3 ? '最近三个月' : (zone == 6 ? '最近六个月' : '自定义'));
+                $scope.condition.$dateZoneOpen = false;
+                getDateCondition(zone, $scope.condition);
+                $scope.tableParams.page(1);
+                $scope.tableParams.reload();
+            };
+
+            $scope.openFilterDatePicker = function ($event, item, openParam) {
+                $event.preventDefault();
+                $event.stopPropagation();
+                item[openParam] = !item[openParam];
+                if ($scope.condition.dateFrom && $scope.condition.dateTo && !item[openParam]) {
+                    $scope.tableParams.reload();
+                }
+            };
+
+            $scope.tableParams = new ngTableParams({
+                page: 1,
+                count: 5,
+                sorting: {
+                    'id': 'desc'
+                }
+            }, {
+                total: 0,
+                counts: [],
+                getData: function ($defer, params) {
+                    $scope.loading = true;
+                    var pageParams = params.url();
+                    pageParams.searchFilter = { // 筛选条件
+                        keyword: $scope.keyword,
+                        fromDate: getDateTime($scope.condition.dateFrom),
+                        endDate: getDateTime($scope.condition.dateTo)
+                    };
+                    change.getEnableOrderList.call(null, BaseService.parseParams(pageParams), function (page) {
+                        $scope.loading = false;
+                        if (page) {
+                            params.total(page.totalElement);
+                            $defer.resolve(page.content);
+                        }
+                    }, function (response) {
+                        $scope.loading = false;
+                        toaster.pop('error', '数据加载失败', response.data);
+                    });
+                }
+            });
+
+           $scope.checkedOrder = null;
+            var checkItems = [];
+            // 单选
+            $scope.checkOne = function (order) {
+                var changeflag = false;
+                order.checked = !order.checked;
+                if ((order.checked) && ($scope.checkedOrder != null) && ($scope.checkedOrder != order)) {
+                    $scope.checkedOrder.checked = false;
+                    angular.forEach($scope.checkedOrder.orderItems, function (item) {
+                        item.checked = false;
+                    });
+                    $scope.checkedOrder = null;
+                    checkItems = [];
+                }
+                if (order.checked) {
+                    $scope.checkedOrder = order;
+                    angular.forEach(order.orderItems, function (item) {
+                        if (item.change) {
+                            item.checked = false;
+                            changeflag = true;
+                        } else {
+                            item.checked = true;
+                            checkItems.push(item);
+                        }
+                    });
+                } else {
+                    $scope.checkedOrder = null;
+                    angular.forEach(order.orderItems, function (item) {
+                        item.checked = false;
+                    });
+                    checkItems = [];
+                }
+                if (checkItems.length == 0 && changeflag) {
+                    order.checked =false;
+                    toaster.pop('warning', '提示', "该采购单所有明细正在变更中,在供应商确认之前不可再次变更");
+                }
+            };
+
+            // 明细
+            $scope.checkItem = function (item, order) {
+                // 先判断选中信息
+                if (item.change) {
+                    toaster.pop('warning', '提示', "该明细正在变更中,在供应商确认之前不可再次变更");
+                    item.checked = null;
+                    return;
+                }
+                order.checked = true;
+                if ($scope.checkedOrder != null && order.id != $scope.checkedOrder.id) {
+                    $scope.checkedOrder.checked = false;
+                    $scope.checkedOrder = order;
+                    order.checked = true;
+                    angular.forEach(checkItems, function (checkItem) {
+                        checkItem.checked = false;
+                    });
+                    checkItems = [];
+                }
+                item.checked = !item.checked;
+                if (item.checked) {
+                    checkItems.push(item);
+                    if ($scope.checkedOrder == null) {
+                        $scope.checkedOrder = order;
+                    }
+                    order.checked = true;
+                } else {
+                    angular.forEach(checkItems, function (checkItem, index) {
+                        if (checkItem.id == item.id) {
+                            checkItems.splice(index, 1);
+                        }
+                    });
+                }
+                if (checkItems.length == 0) {
+                    $scope.checkedOrder = null;
+                    order.checked = false;
+                }
+            };
+
+            // 搜索框回车
+            $scope.onSearch = function (keyword) {
+                $scope.tableParams.page(1);
+                $scope.tableParams.reload();
+            };
+
+            $scope.getCartTotal = function (items) {
+                var sum = 0;
+                angular.forEach(items, function (item) {
+                    sum += item.qty * item.price;
+                });
+                return sum;
+            };
+
+            // 选择
+            $scope.choose = function () {
+                if ($scope.checkedOrder == null || checkItems.length == 0) {
+                    toaster.pop('error', '请先选择采购单信息');
+                } else {
+                    $scope.checkedOrder.orderItems = checkItems;
+                    $modalInstance.close($scope.checkedOrder);
+                }
+            }
+
+            // 关闭
+            $scope.close = function () {
+                $modalInstance.dismiss();
+            };
+        }]);
+
+    /**
+     * 采购变更单详情
+     */
+    app.controller('PurcChangeDetailCtrl', ['$scope', '$stateParams', 'change', 'toaster', 'CurrentRole',
+        function ($scope, $stateParams, change, toaster, CurrentRole) {
+        // 获取当前用户是否为普通用户
+        CurrentRole.isUser({}, {}, function (data) {
+            $scope.isUser = data.isUser;
+        });
+        var loadData = function () {
+            change.getItem({id: $stateParams.id}, function (data) {
+                $scope.change = data;
+            }, function (response) {
+                toaster.pop('error', '', response.data);
+            });
+        };
+        loadData();
+        $scope.openDatePicker = function ($event, item, openParam) {
+            $event.preventDefault();
+            $event.stopPropagation();
+            item[openParam] = !item[openParam];
+        };
+    }]);
+
     return app;
 });

+ 73 - 0
src/main/webapp/resources/js/index/services/PurcChange.js

@@ -0,0 +1,73 @@
+/**
+ * 采购变更service
+ * 
+ * @author hejq
+ * @date 2018-06-25 17:06
+ */
+define([ 'ngResource'], function() {
+    angular.module('changeService', [ 'ngResource']).factory('change', ['$resource', function($resource) {
+        return $resource('purc/change/info', {}, {
+            /**
+             * 以客户角度,获取全部采购变更单
+             */
+            getAll: {
+                
+            },
+            /**
+             * 以客户角度,获取待处理的采购变更单
+             */
+            getTodo: {
+                params: {
+                    _state: 'todo'
+                }
+            },
+            /**
+             * 以客户角度,获取已确认的采购变更单
+             */
+            getDone: {
+                params: {
+                    _state: 'done'
+                }
+            },
+            /**
+             * 以客户角度,获取无需确认的采购变更单
+             */
+            getUnread: {
+                params: {
+                    _state: 'unread'
+                }
+            },
+            /**
+             * 查询符合条件的可以作为采购变更单的采购单信息
+             */
+            getEnableOrderList: {
+                url: 'purc/change/enable/orderList'
+            },
+            /**
+             * 保存采购变更单
+             */
+            save: {
+                method: 'POST',
+                url: 'purc/change/save',
+                isArray: false,
+                headers: {
+                    'Content-Type' : 'application/json;charset=UTF-8'
+                }
+            },
+            /**
+             * 查询采购变更单详情
+             */
+            getItem: {
+                url: 'purc/change/:id/info',
+                method: 'GET'
+            },
+            /**
+             * 导出
+             */
+            exportXls: {
+                url: 'purc/change/xls/permission',
+                method: 'GET'
+            }
+        })
+    }])
+});

+ 398 - 0
src/main/webapp/resources/tpl/index/purc/changeList.html

@@ -0,0 +1,398 @@
+<style>
+.order-table .header>th {
+	height: 38px;
+	text-align: center;
+	background: #f5f5f5;
+	border-top: 1px solid #e8e8e8;
+	border-bottom: 1px solid #e8e8e8;
+}
+
+.order-table .sep-row {
+	height: 10px;
+}
+
+.order-table .selector {
+	vertical-align: middle;
+	margin: 0 0 2px 0;
+}
+
+.toolbar label {
+	margin-right: 10px;
+	margin-bottom: 0;
+}
+
+.toolbar .select_all {
+	margin: 0 6px 0 10px;
+	line-height: 20px;
+}
+
+.toolbar .btn {
+	-moz-border-radius: 2px;
+	margin-right: 5px;
+	border: 1px solid #dcdcdc;
+	border-radius: 2px;
+	-webkit-border-radius: 2px;
+}
+
+.order-table .order-hd {
+	background: #f5f5f5;
+	height: 40px;
+	line-height: 40px;
+}
+
+.order-table .order-hd td.first {
+	padding-left: 20px;
+}
+
+.order-table .order-hd .order-main span {
+	margin-right: 8px;
+}
+
+.order-table .order-hd .order-code {
+	font-style: normal;
+	font-family: verdana;
+}
+
+.order-table .order-hd .order-sum {
+	padding: 0 5px;
+}
+
+.order-table .order-info {
+	padding-left: 45px;
+}
+
+.order-table>tbody {
+	border: 1px solid transparent;
+}
+
+.order-table>tbody:hover {
+	border-color: #56a022;
+	border-width: 2px;
+}
+
+.order-table .operates {
+	display: none;
+}
+
+.order-table>tbody:hover .operates {
+	display: block;
+}
+
+.order-table .order-bd {
+	border-bottom: 1px solid #e6e6e6;
+}
+
+.order-table .order-bd>td {
+	padding: 10px 5px;
+	vertical-align: top;
+	position: relative;
+}
+
+.order-table .order-bd .product {
+	padding-left: 20px;
+}
+
+.menu .new-dot{
+	width: 20px;
+	height: 20px;
+	line-height: 20px;
+	font-size: 12px;
+	color: #fff;
+	font-weight: inherit;
+	top: -2px;
+}
+</style>
+<link rel="stylesheet" href="static/css/public.css">
+<div class="block"  id="public">
+<div class="loading in" ng-class="{'in': loading}">
+	<i></i>
+</div>
+<div class="pub-com_head">
+	<span>采购变更单</span>
+	<div class="p-right">
+		<a ui-sref="purc.changeNew" type="button" title="新增采购变更单"><i class="fa fa-plus-square fa-fw"></i>新增</a>
+		<a href="#" ng-click="exportXls()" target="_self" class="text-simple" title="导出Excel表格"><i class="fa fa-file-text fa-fw"></i>导出</a>
+	</div>
+</div>
+<div class="menu condition block">
+		<div class="row">
+			<div class="col-xs-4">
+				<div class="btn-group btn-group-sm btn-group-justified">
+					<div class="btn-group btn-group-sm">
+						<button type="button" class="btn btn-default btn-line"
+							ng-class="{'btn-info':active=='all'}" ng-click="setActive('all')">全部
+							<b class="new-dot" ng-if="unread.all > 0">{{unread.all>99?'99+':unread.all}}</b>
+						</button>
+					</div>
+					<div class="btn-group btn-group-sm">
+						<button type="button" class="btn btn-default btn-line"
+							ng-class="{'btn-info':active=='done'}" ng-click="setActive('done');setOrdersReadByState()">已处理
+							<b class="new-dot" ng-if="unread.replied > 0">{{unread.replied>99?'99+':unread.replied}}</b>
+						</button>
+					</div>
+					<div class="btn-group btn-group-sm">
+						<button type="button" class="btn btn-default btn-line"
+							ng-class="{'btn-info':active=='todo'}" ng-click="setActive('todo')">待确认
+							<b class="new-dot" ng-if="unread.notReply > 0">{{unread.notReply>99?'99+':unread.notReply}}</b>
+						</button>
+					</div>
+					<div class="btn-group btn-group-sm">
+						<button type="button" class="btn btn-default btn-line"
+							ng-class="{'btn-info':active=='unread'}" ng-click="setActive('unread')">无需确认
+							<b class="new-dot" ng-if="unread.unNeedReply > 0">{{unread.unNeedReply>99?'99+':unread.unNeedReply}}</b>
+						</button>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+<!--<div class="height10">&nbsp;</div>-->
+	<div class="condition block">
+		<div class="search-bg condition block" style="padding: 10px 15px;">
+			<div class="row">
+				<div id="topSearch" style="float: left">
+					<a ng-click="changeDateZone(1);condition.$open=false" title="最近一个月" ng-class="{'active':condition.dateZone=='1'}">最近一个月</a>
+					<a ng-click="changeDateZone(3);condition.$open=false" title="最近三个月" ng-class="{'active':condition.dateZone=='3'}">最近三个月</a>
+					<a ng-click="changeDateZone(6);condition.$open=false" title="最近六个月" ng-class="{'active':condition.dateZone=='6'}">最近六个月</a>
+					<a ng-click="condition.$open=!condition.$open;changeDateZone(-1)" title="自定义" ng-class="{'active':condition.dateZone=='-1'}" >自定义</a>
+				</div>
+				<div class="col-xs-6" style="float: right;">
+					<div class="search">
+						<div class="form-group form-group-sm has-feedback" dropdown auto-close="outsideClick"
+							 on-toggle="searchAdvance=open">
+							<input type="search" class="form-control input-sm" ng-model="keyword"
+								   ng-search="onSearch(keyword)" placeholder="输入单据编号、客户名称、物料名称搜索" style="width: 100%"/>
+							<a class="btn input-group-addon" ng-click="onSearch(keyword)">搜索</a>
+						</div>
+					</div>
+				</div>
+			</div>
+			<div class="more-list more" ng-class="{'open': condition.$open}">
+				<form class="form-inline">
+					<div class="form-group ">
+						<label>日期:</label>
+						<div class="btn-group btn-menu" dropdown is-open="condition.$dateZoneOpen">
+							<ul class="dropdown-menu">
+								<li><a ng-click="changeDateZone(1)">一个月内</a></li>
+								<li><a ng-click="changeDateZone(6)">半年内</a></li>
+								<li><a ng-click="changeDateZone()">半年前</a></li>
+							</ul>
+						</div>
+						<div class="form-group input-group input-group-xs input-trigger">
+							<input type="text" ng-model="condition.dateFrom"
+								   class="form-control" placeholder="从"
+								   datepicker-popup="yyyy-MM-dd" is-open="condition.$fromOpened"
+								   ng-required="true" max-date = "condition.dateTo"
+								   current-text="今天" clear-text="清除" close-text="关闭"
+								   datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+								   ng-focus="openFilterDatePicker($event, condition, '$fromOpened')">
+							<span class="input-group-btn">
+							<button type="button" class="btn btn-default"
+									ng-click="openFilterDatePicker($event, condition, '$fromOpened')">
+								<i class="fa fa-calendar"></i>
+							</button>
+						</span>
+						</div>
+						<div class="form-group input-group input-group-xs input-trigger">
+							<input type="text" ng-model="condition.dateTo"
+								   class="form-control" placeholder="到"
+								   datepicker-popup="yyyy-MM-dd" is-open="condition.$toOpened"
+								   ng-required="true" min-date = "condition.dateFrom"
+								   current-text="今天" clear-text="清除" close-text="关闭"
+								   datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+								   ng-focus="openFilterDatePicker($event, condition, '$toOpened')">
+							<span class="input-group-btn">
+							<button type="button" class="btn btn-default"
+									ng-click="openFilterDatePicker($event, condition, '$toOpened')">
+								<i class="fa fa-calendar"></i>
+							</button>
+						</span>
+						</div>
+					</div>
+				</form>
+			</div>
+		</div>
+	</div>
+<table class="order-table block" ng-table="tableParams">
+	<thead>
+		<tr class="header">
+			<th width="580">产品</th>
+			<th width="100">单价</th>
+			<th width="50">数量</th>
+			<th width="120">交货日期</th>
+			<th width="120">变更内容</th>
+		</tr>
+		<tr class="sep-row">
+			<td colspan="6"></td>
+		</tr>
+	</thead>
+	<tbody ng-repeat="change in $data track by change.id">
+		<tr class="order-hd">
+			<td class="first" colspan="4">
+				<div class="order-main">
+					<a href="javascript:void(0)" ng-if="!isUnread(change.id)">
+						<i class="fa fa-circle-thin"></i>
+					</a>
+					<a href="javascript:void(0)" ng-if="isUnread(change.id)">
+						<i class="fa fa-circle" style="color: #f40;"></i>
+					</a>&nbsp;&nbsp;
+					<span class="text-num text-bold"
+						ng-bind="::change.date | date:'yyyy-MM-dd'"></span>
+					<span ng-bind="::change.apVendorName"></span>
+					<span>流水号:<a title="查看变更单详情"
+						class="text-num order-detail" ng-bind="::change.code" ui-sref="purc.change_detail({id:change.id})" target="_self"
+						ng-click="setOrdersRead(change.id)"></a>
+					</span>
+					<span>订单:<a title="查看采购单详情"
+						class="text-num text-bold order-detail" ng-bind="::change.orderCode" ui-sref="purc.order_detail({id:change.orderId})" target="_blank"></a></span>
+				</div>
+			</td>
+			<td colspan="2" class="" style="line-height: 20px; padding-top: 5px;">
+				<span ng-bind="change.description"></span>
+			</td>
+		</tr>
+		<tr class="order-hd">
+			<td colspan="6" class="order-info">
+				 <span><span class="text-bold">币别:</span>
+				 	<span ng-class="{'text-inverse': change.newCurrency != change.oldCurrency}" ng-bind="::change.newCurrency"></span>&nbsp;
+				 	<s class="text-muted" ng-if="(change.newCurrency != change.oldCurrency) && (change.newCurrency != null)" ng-bind="::change.oldCurrency"></s>
+					<span  ng-if="(change.newCurrency != change.oldCurrency) && (change.newCurrency == null)" ng-bind="::change.oldCurrency"></span>&nbsp;&nbsp;&nbsp;&nbsp;
+				 </span>
+				 <span><span class="text-bold">支付方式:</span>
+				 	<span ng-class="{'text-inverse': change.newPayments != change.oldPayments}" ng-bind="::change.newPayments"></span>&nbsp;
+				 	<s class="text-muted" ng-if="(change.newPayments != change.oldPayments) && (change.newPayments != null)" ng-bind="::change.oldPayments"></s>
+					<span  ng-if="(change.newPayments != change.oldPayments) && (change.newPayments == null)" ng-bind="::change.oldPayments"></span>&nbsp;&nbsp;&nbsp;&nbsp;
+				 </span>
+				<span><span class="text-bold" ng-if="change.newApVendorName">应付供应商:</span>
+				 	<span ng-class="{'text-inverse': change.apVendorName != change.newApVendorName && change.newApVendorName != null}" ng-bind="::change.newApVendorName"></span>&nbsp;
+				 	<s class="text-muted" ng-if="change.apVendorName != change.newApVendorName  && change.newApVendorName != null" ng-bind="::change.apVendorName"></s>
+				</span>
+			</td>
+		</tr>
+		<tr ng-if="change.$editing" class="br-b">
+			<td colspan="2"></td>
+			<td colspan="2">
+				<div style="margin: 0 auto" ng-init="change.$agreed = 1">
+					<div class="form-group">
+						<label class="radio-inline"> <input type="radio"
+							ng-model="change.$agreed" value="1"> 同意
+						</label> <label class="radio-inline"> <input type="radio"
+							ng-model="change.$agreed" value="0"> 不同意
+						</label>
+					</div>
+				</div>
+			</td>
+			<td>
+				<div class="form-group">
+					<input type="text" ng-model="change.replyRemark"
+						class="form-control input-xs" placeholder="回复备注">
+				</div>
+			</td>
+			<td class="text-center"><br>
+				<div>
+					<a ng-click="change.$editing=!change.$editing">取消</a>
+				</div> <br>
+				<div>
+					<a ng-click="onReplyClick(change);setOrdersRead(change.id)" class="text-inverse">确认回复</a>
+				</div> <br></td>
+		</tr>
+		<tr class="order-bd" ng-repeat="item in ::change.orderChangeItems">
+			<td class="product">
+				<div>
+					<span class="text-num text-bold"  ng-bind="::item.oldProduct.code"></span><span class="text-muted">(型号)</span>
+					<span class="text-light">&nbsp;&nbsp;&nbsp;订单第 <span class="text-num">{{::item.orderItemNumber}}</span> 行</span>
+				</div>
+				<!--<div>-->
+					<!--<span class="text-num text-bold"  ng-bind="::item.oldProduct.code"></span>-->
+				<!--</div>-->
+				<div>
+					<span ng-bind="::item.oldProduct.title"></span><span class="text-muted">(名称)</span>
+				</div>
+				<!--<div><span ng-bind="::item.oldProduct.title"></span></div>-->
+				<div>
+					<span ng-bind="::item.oldProduct.spec"></span><span class="text-muted">(规格)</span>
+				</div>
+				<!--<div><span class="text-muted" ng-bind="::item.oldProduct.spec"></span></div>-->
+			</td>
+			<td class="text-center">
+				<div class="text-num" ng-if="!isUser"
+					ng-class="{'text-inverse': item.newPrice != item.oldPrice}"
+					title="{{item.newPrice}}" ng-bind="::item.newPrice | number:6"></div>
+				<div ng-if="isUser" ng-class="{'text-inverse': item.newPrice != item.oldPrice}">-</div>
+				<div ng-show="(item.newPrice != item.oldPrice) && (item.newPrice != null)">
+					<s ng-if="!isUser" class="text-num text-muted" ng-bind="::item.oldPrice | number:6"></s>
+					<s ng-if="isUser" class="text-num text-muted" >-</s>
+				</div>
+				<div ng-show="(item.newPrice != item.oldPrice) && (item.newPrice == null)">
+					<span ng-if="!isUser"  ng-bind="::item.oldPrice | number:6"></span>
+					<span ng-if="isUser"  >-</span>
+				</div>
+				<div class="text-muted">
+					税率 <span ng-show="item.newTaxrate != item.oldTaxrate && item.newTaxrate != null"><span class="text-num" ng-class="{'text-inverse': item.newTaxrate != item.oldTaxrate && item.newTaxrate != null}">
+						{{::item.newTaxrate}}%
+					</span> </span><s ng-if="(item.newTaxrate != item.oldTaxrate) && (item.newTaxrate != null)">{{::item.oldTaxrate}}%</s>
+					<span ng-if="(item.newTaxrate != item.oldTaxrate) && (item.newTaxrate == null)">{{::item.oldTaxrate}}%</span>
+				</div>
+			</td>
+			<td class="text-center">
+				<div class="text-num"
+					ng-class="{'text-inverse': item.newQty != item.oldQty}"
+					title="{{item.newQty}}" ng-bind="::item.newQty"></div>
+				<div ng-show="item.newQty != item.oldQty && item.newQty != null">
+					<s class="text-num text-muted" title="{{item.oldQty}}"
+						ng-bind="::item.oldQty"></s>
+				</div>
+				<div ng-show="item.newQty != item.oldQty && item.newQty == null">
+					<span  title="{{item.oldQty}}"
+					   ng-bind="::item.oldQty"></span>
+				</div>
+				<div class="text-muted" ng-bind="::item.newProduct.unit"></div>
+			</td>
+			<td class="text-center br-l">
+				<div class="text-num"
+					ng-class="{'text-inverse': item.newDelivery != item.oldDelivery}"
+					ng-bind="::item.newDelivery | date:'yyyy-MM-dd'"></div>
+				<div ng-show="item.newDelivery != item.oldDelivery && item.newDelivery != null">
+					<s class="text-num text-muted"
+						ng-bind="::item.oldDelivery | date:'yyyy-MM-dd'"></s>
+				</div>
+				<div ng-show="item.newDelivery != item.oldDelivery && item.newDelivery == null">
+					<span
+					   ng-bind="::item.oldDelivery | date:'yyyy-MM-dd'"></span>
+				</div>
+			</td>
+			<td class="text-center br-l" colspan="2">
+				<div ng-bind="::item.description"></div>
+				<div ng-if="change.agreed == 1 && !change.unNeedReply" class="block">
+					<span class="text-trans success">已同意</span>
+				</div>
+				<div ng-if="change.unNeedReply" class="block">
+					<span class="text-trans success">无需确认</span>
+				</div>
+				<div ng-if="change.agreed == 0" class="block">
+					<span class="text-trans warning">不同意</span>
+				</div>
+				<div ng-show="change.agreed == null && change.unNeedReply == 0" class="block">
+					<span class="text-trans success">待供应商确认</span>
+				</div>
+			</td>
+		</tr>
+	</tbody>
+	<tbody ng-if="tableParams.total() == 0">
+	<tr>
+		<td colspan="6">
+			<div id="empty">
+				<div class="left_img">
+					<a href="http://www.ubtob.com/" target="_blank" title="优软云首页"><img src="static/img/empty/uas_empty.png"></a>
+					<a href="#/index" title="B2B商务首页">B2B 商务</a>
+				</div>
+				<div class="right_link">
+					<p>暂无对应的单据</p>
+					<a href="javascript:location.reload()">点击重新加载<i class="load_icon"></i></a>
+				</div>
+			</div>
+		</td>
+	</tr>
+	</tbody>
+</table>
+</div>

+ 204 - 0
src/main/webapp/resources/tpl/index/purc/change_detail.html

@@ -0,0 +1,204 @@
+<style>
+	#order-detail-list .table-default .header th{
+		display: inline-block;
+	}
+</style>
+<div class="pane base-info" id="order-detail-list">
+	<div class="pub-com_head">
+		<span>采购变更单</span>
+		<div class="p-right">
+			<!-- <a href="#" class="pull-right text-simple"><i
+			class="fa fa-print fa-fw"></i>打印</a> -->
+		</div>
+	</div>
+	<div class="pane-body">
+		<div class="title-div" style="border-bottom: 1px dashed #3f84f6;">
+			<span class="f14">单据信息</span>&nbsp;
+		</div>
+		<div class="row row-sm item">
+			<div class="col-xs-3">
+				<span class="title">流水号</span>
+				<div class="content" ng-bind="::change.code"></div>
+			</div>
+			<div class="col-xs-3">
+				<span class="title">日期</span>
+				<div class="content" ng-bind="::change.date | date:'yyyy-MM-dd'"></div>
+			</div>
+			<div class="col-xs-6">
+				<span class="title">原供应商</span>
+				<div class="content" ng-bind="::change.apVendorName"></div>
+			</div>
+		</div>
+		<div class="row row-sm item">
+			<div class="col-xs-3">
+				<span class="title">录单人</span>
+				<div class="content" ng-bind="::change.recorder"></div>
+			</div>
+			<div class="col-xs-9">
+				<span class="title">备注</span>
+				<div class="content" ng-bind="::change.remark"></div>
+			</div>
+		</div>
+		<div class="title-div" style="border-bottom: 1px dashed #3f84f6;">
+			<span class="f14">原采购单</span>&nbsp;
+		</div>
+		<div class="row row-sm item">
+			<div class="col-xs-3">
+				<span class="title">采购单号</span>
+				<div class="content">
+					<a ng-bind="::change.orderCode"
+						ui-sref="purc.order_detail({id:change.orderId})" target="_blank"></a>
+				</div>
+			</div>
+		</div>
+		<div class="title-div" style="border-bottom: 1px dashed #3f84f6;">
+			<span class="f14">交易信息变更</span>&nbsp;
+		</div>
+		<div class="row row-sm item">
+			<div class="col-xs-3">
+				<span class="title">币别</span>
+				<div class="content">
+					<span ng-class="{'text-inverse': change.newCurrency != change.oldCurrency}"
+						ng-bind="::change.newCurrency"></span> 
+					<s ng-show="(change.newCurrency != change.oldCurrency)  && (change.newCurrency != null)"
+						class="text-muted" ng-bind="::change.oldCurrency"></s>
+					<span ng-show="(change.newCurrency != change.oldCurrency)  && (change.newCurrency == null)"
+					    ng-bind="::change.oldCurrency"></span>
+				</div>
+			</div>
+			<div class="col-xs-3">
+				<span class="title">汇率</span>
+				<div class="text-num content">
+					<span
+						ng-class="{'text-inverse': change.newRate != change.oldRate}"
+						ng-bind="::change.newRate"></span> <s
+						ng-show="(change.newRate != change.oldRate)  && (change.newRate != null)" class="text-muted"
+						ng-bind="::change.oldRate"></s> <span
+						ng-show="(change.newRate != change.oldRate)  && (change.newRate == null)"
+						ng-bind="::change.oldRate"></span>
+				</div>
+			</div>
+			<div class="col-xs-6">
+				<span class="title">付款方式</span>
+				<div class="content">
+					<span ng-class="{'text-inverse': change.newPayments != change.oldPayments}"
+						ng-bind="::change.newPayments"></span> 
+					<s ng-show="change.newPayments != change.oldPayments && change.newPayments != null"
+						class="text-muted" ng-bind="::change.oldPayments"></s>
+					<span ng-show="change.newPayments != change.oldPayments && change.newPayments == null"
+					    ng-bind="::change.oldPayments"></span>
+				</div>
+			</div>
+			<div class="col-xs-12">
+				<span class="title" ng-if="change.newApVendorName">应付供应商</span>
+				<div class="content">
+				 	<span ng-class="{'text-inverse': change.apVendorName != change.newApVendorName && change.newApVendorName != null}" ng-bind="::change.newApVendorName"></span>&nbsp;
+				 	<s class="text-muted" ng-if="change.apVendorName != change.newApVendorName && change.newApVendorName != null" ng-bind="::change.apVendorName"></s>
+				</div>
+			</div>
+		</div>
+		<div class="title-div" style="border-bottom: 1px dashed #3f84f6; position: relative;">
+			<span class="f14">产品变更详情</span>
+		</div>
+		<div class="block">
+			<table class="block table table-default table-striped table-hover" style="margin-bottom: 0;">
+				<thead>
+				<tr class="header">
+					<th width="380">产品</th>
+					<th width="100">单价</th>
+					<th width="60">数量</th>
+					<th width="120">交货日期</th>
+					<th width="140">变更内容</th>
+					<th width="70">操作</th>
+				</tr>
+				</thead>
+			</table>
+			<table class="block table table-default table-striped table-hover" ng-class="{'scoroll':order.orderItems.length>10}">
+				<tbody>
+					<tr ng-repeat="item in change.orderChangeItems track by item.id">
+						<td width="380">
+							<div>
+								<span class="text-num text-bold" ng-class="{'text-inverse'}" ng-bind="::item.oldProduct.code"></span><span class="text-muted">(型号)</span>
+								<span class="text-light">&nbsp;&nbsp;&nbsp;订单第 <span class="text-num">{{::item.orderItemNumber}}</span> 行</span>
+							</div>
+							<!--<div>-->
+								<!--<span class="text-num text-bold"  ng-bind="::item.oldProduct.code"></span>-->
+							<!--</div>-->
+							<div>
+								<span ng-bind="::item.oldProduct.title"></span><span class="text-muted">(名称)</span>
+							</div>
+							<!--<div><span ng-bind="::item.oldProduct.title"></span></div>-->
+							<div>
+								<span ng-class="{'text-inverse'}" ng-bind="::item.oldProduct.spec"></span><span class="text-muted">(规格)</span>
+							</div>
+							<!--<div><span class="text-muted"  ng-bind="::item.oldProduct.spec"></span></div>-->
+						</td>
+						<td class="text-center" width="100">
+							<div class="text-num" ng-if="!isUser"
+								ng-class="{'text-inverse': item.newPrice != item.oldPrice}"
+								title="{{item.newPrice}}" ng-bind="::item.newPrice | number:6"></div>
+							<div ng-if="isUser" ng-class="{'text-inverse': item.newPrice != item.oldPrice}">-</div>
+							<div ng-show="item.newPrice != item.oldPrice && item.newPrice != null">
+								<s ng-if="!isUser" class="text-num text-muted" ng-bind="::item.oldPrice | number:6"></s>
+								<s ng-if="isUser" class="text-num text-muted" >-</s>
+							</div>
+							<div ng-show="item.newPrice != item.oldPrice && item.newPrice == null">
+								<span ng-if="!isUser"  ng-bind="::item.oldPrice | number:6"></span>
+								<span ng-if="isUser"  >-</span>
+							</div>
+							<div class="text-muted">
+								税率 <span ng-show="item.newTaxrate != item.oldTaxrate && item.newTaxrate != null"><span class="text-num" ng-class="{'text-inverse': item.newTaxrate != item.oldTaxrate && item.newTaxrate != null}">
+						{{::item.newTaxrate}}%
+					</span> </span><s ng-if="(item.newTaxrate != item.oldTaxrate) && (item.newTaxrate != null)">{{::item.oldTaxrate}}%</s>
+								<span ng-if="(item.newTaxrate != item.oldTaxrate) && (item.newTaxrate == null)">{{::item.oldTaxrate}}%</span>
+							</div>
+						</td>
+						<td class="text-center" width="60">
+							<div class="text-num"
+								ng-class="{'text-inverse': item.newQty != item.oldQty}"
+								title="{{item.newQty}}" ng-bind="::item.newQty"></div>
+							<div ng-show="item.newQty != item.oldQty && item.newQty != null">
+								<s class="text-num text-muted" title="{{item.oldQty}}"
+									ng-bind="::item.oldQty"></s>
+							</div>
+							<div ng-show="item.newQty != item.oldQty && item.newQty == null">
+								<span  title="{{item.oldQty}}"
+						   		ng-bind="::item.oldQty"></span>
+							</div>
+							<div class="text-muted" ng-bind="::item.newProduct.unit"></div>
+						</td>
+						<td class="text-center" width="120">
+							<div class="text-num"
+								ng-class="{'text-inverse': item.newDelivery != item.oldDelivery}"
+								ng-bind="::item.newDelivery | date:'yyyy-MM-dd'" style="width: 100%"></div>
+							<div ng-show="item.newDelivery != item.oldDelivery && item.newDelivery != null">
+								<s class="text-num text-muted"
+									ng-bind="::item.oldDelivery | date:'yyyy-MM-dd'"></s>
+							</div>
+							<div ng-show="item.newDelivery != item.oldDelivery && item.newDelivery == null">
+					<span
+							ng-bind="::item.oldDelivery | date:'yyyy-MM-dd'"></span>
+							</div>
+						</td>
+						<td colspan="2" width="210">
+							<div ng-bind="change.description"></div>
+							<div ng-if="change.agreed == 1" class="block">
+								<span class="text-trans success">已同意</span>
+							</div>
+							<div ng-if="change.agreed == 0" class="block">
+								<span class="text-trans warning">不同意</span>
+							</div>
+							<div ng-if="change.unNeedReply == 1" class="block">
+								<span class="text-trans success">无需确认</span>
+							</div>
+							<div ng-show="change.agreed == null && change.unNeedReply == 0" class="block">
+								<span class="text-trans success">待供应商确认</span>
+							</div>
+
+						</td>
+					</tr>
+				</tbody>
+			</table>
+		</div>
+	</div>
+</div>

+ 342 - 0
src/main/webapp/resources/tpl/index/purc/change_new.html

@@ -0,0 +1,342 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8"/>
+    <title>采购变更单</title>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
+    <meta name="Keywords" content=""/>
+    <meta name="Description" content=""/>
+    <link rel="stylesheet" href="static/css/deputyOrder/base.css"/>
+    <link rel="stylesheet" href="static/css/deputyOrder/order.css"/>
+</head>
+<body>
+<style>
+/* 日期选择器 */
+    .date-picker span .btn-open {
+        color: #fff;
+        background-color: #5078cb;
+        border-radius: 0;
+        border: 1px solid #5078cb;
+        border-left: none;
+    }
+
+    /* 修改本页内btn的样式 及datepicker中的btn-success的样式 */
+    .date-picker .btn {
+        border-radius: 0;
+    }
+
+   .date-picker .btn-success {
+        background-color: #3f84f6;
+    }
+    .date-picker ul {
+        border-radius: 0;
+    }
+   .date-picker ul div:focus {
+        outline: none;
+        border-radius: 0;
+        border: none;
+    }
+.purchase_form01 ul li .dropdown-menu {
+	width: 257px;
+	height: 300px;
+}
+.purchase_form01 ul li .dropdown-menu span{
+	width: 14px;
+	height: 16px;
+	line-height: 20px;
+}
+.purchase_form01 ul li.ng-scope{
+	margin-top: 210px
+}
+.purchase_form01 ul li.ng-scope span{
+	width: 120px;
+	height: 50px;
+}
+.purchase_form01 ul li .input-group .input-group-btn .btn-sm{
+	width: 37px;
+    height: 34px;
+    z-index: 3;
+    position: absolute;
+    background: #bfbfbf;
+    border: 1px solid #bfbfbf;
+    margin-left: 75px;
+}
+.purchase_form01 ul li .input-group .input-group-btn .btn-sm:focus{
+    background: #5078cb;
+}
+.purchase_form01 ul li .input-group .form-control {
+    width:200px;
+    background: #fff;
+    border: #bfbfbf 1px solid;
+	}
+.purchase_form01 ul li .input-group .form-control:focus{
+    border: #5078cb 1px solid;
+}
+.purchase_form01 ul li .dropdown-menu li{
+  line-height: 30px;
+}
+.purchase_form01 ul li .dropdown-menu button{
+	position: relative;
+	widhth: 46px;
+	height: 30px;
+    border-color: #fff;
+}
+.purchase_form01 ul li .dropdown-menu div{
+	width: 255px;
+	height: 220px;
+}
+
+.purchase_form01 ul li .dropdown-menu span i{
+	color: white;
+}
+
+.purchase_xq dd input{
+ 	border: none;
+	border-bottom: 1px solid #333;
+	height: 35px;
+	width: 80px;
+	font-size: 14px;
+}
+
+.purchase_xq dd input:focus {
+	border-bottom: 1px solid blue;
+}
+
+.purchase .input-group .form-control{
+	border-radius: 0px;
+	border: 1px solid #5078cb;
+}
+
+.purchase .input-group .input-group-btn i{
+	color: #fff;
+}
+
+.purchase .input-group .input-group-btn {
+	width: 37px;
+	height: 34px;
+	position: absolute;
+	right: 74px;
+}
+.purchase_xq dl span.wid01{
+    width: 4% !important;
+}
+.purchase_xq dl span.wid02{
+    width: 13% !important;
+}
+.purchase_xq dl span{
+    width: 9.2% !important;
+}
+.purchase_xq dd input{
+    width: 92%;
+}
+.purchase_form01 b {
+	color: red;
+}
+.com_title01 span{
+    margin-left: 37px;
+}
+    /*新增变更明细*/
+.purchase_xq {
+    width: 948px;
+    overflow: auto;
+}
+.purchase_xq .table{
+    margin-bottom: 0;
+    table-layout: fixed;
+    border-collapse: collapse;
+    width: 100%;
+}
+.purchase_xq .table thead tr>th{
+    font-size: 14px;
+    height: 35px;
+    line-height: 35px;
+    color: #323232;
+    border-bottom: 1px solid #ddd;
+    font-weight: normal;
+    text-align: center;
+}
+.purchase_xq .table tbody tr td{
+    width: 100%;
+    text-align: center;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    vertical-align: middle;
+}
+.purchase_xq .table tbody tr td input{
+    border: none;
+    height: 35px;
+    width: 80px;
+    font-size: 14px;
+}
+.purchase_xq .table tbody tr td input:focus {
+    border: #3578ba 1px solid !important;
+    outline: 0;
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
+}
+.purchase_xq .input-group .form-control {
+        width: 80px;
+        height: 30px;
+        line-height: 30px;
+        border: none;
+        border-radius: 5px;
+        background: #dcdcdc;
+    }
+.purchase_xq .table tbody tr td input.form-control:focus{
+    border: none!important;
+}
+.purchase_xq .table tbody tr td ul.dropdown-menu{
+    min-width: auto !important;
+    display: block;
+    top: 712px;
+    left: 1100.5px!important;
+}
+.save button[disabled] {
+    background-color: #A9A9A9;
+}
+</style>
+<form class="width100" name="orderChange" autocomplete="off" id="orderChange">
+<div class="warp">
+    <div class=" purchase">
+
+            <div class="com_head"><span>采购变更单</span></div>
+            <div class="purchase_form">
+                <!--基本信息-->
+                <div class="com_title01"><span>基本信息</span></div>
+                <div class="purchase_form01 clearfix">
+                    <ul>
+                        <li>
+                            <div class="fl">
+                                <em>变更单号:</em>
+                                <span ng-bind="change.code"></span>
+                            </div>
+                            <div class="fl">
+                                <em>采购单号:</em>
+                                <div class="input-group">
+                                    <span class="input-group-btn">
+                                        <button class="btn btn-sm" type="button" ng-click="getEnableOrders()"><i class="fa fa-search"></i></button>
+                                    </span>
+                                    <input type="text" ng-model="change.orderCode" class="form-control" ng-click="getEnableOrders()" readonly>
+                                </div>
+                            </div>
+                        </li>
+                        <li>
+                            <div class="fr">
+                                <em>录入人:</em>
+                                <span ng-bind="change.recorder"></span>
+                            </div>
+                            <div class="fr">
+                                <em>录入日期:</em>
+                                <span class="has_time" ng-bind="change.date| date: 'yyyy-MM-dd'"></span>
+                            </div>
+                        </li>
+                        <li>
+                            <div class="fr">
+                                <em>原付款方式:</em>
+                                <span ng-bind="change.oldPayments || '无'"></span>
+                            </div>
+                            <div class="fr">
+                                <em>新付款方式:</em>
+                                <input ng-model="change.newPayments" list="newPayments" class="select"  placeholder="选择付款方式" />
+                                <datalist id="newPayments">
+                                    <option value="月结30天">月结30天</option>
+                                    <option value="月结60天">月结60天</option>
+                                    <option value="现金支付">现金支付</option>
+                                </datalist>
+                                <!--<span><input type="text" class="input01" ng-model="change.newPayments"></span>-->
+                            </div>
+                        </li>
+                        <li>
+                            <div class="fr">
+                                <em>原付款币种:</em>
+                                <span ng-bind="change.oldCurrency || '无'"></span>
+                            </div>
+                            <div class="fr">
+                                <em>新付款币种:</em>
+                                <input ng-model="change.newCurrency" list="newCurrency" class="select"  placeholder="选择付款币种"/>
+                                <datalist id="newCurrency">
+                                    <option value="RMB">RMB</option>
+                                    <option value="USD">USD</option>
+                                    <option value="HKD">HKD</option>
+                                </datalist>
+                            </div>
+                        </li>
+                        <li>
+                            <div class="fr">
+                                <em>备注:</em>
+                                <span><input type="text" class="input01" ng-model="change.remark"></span>
+                            </div>
+                            <div class="fr">
+                                <em>是否需要供应商确认:</em>
+                                <select name="" class="select" ng-model="change.unNeedReply" required="true">
+                                    <option value="0">是</option>
+                                    <option value="1">否</option>
+                                </select>
+                            </div>
+                        </li>
+                    </ul>
+                </div>
+                <div class="com_title01"><span>变更明细</span></div>
+                <div class="purchase_xq clearfix" scroll-table>
+                    <table class="table">
+                        <thead>
+                        <tr>
+                            <th width="60">序号</th>
+                            <th width="160">产品名称</th>
+                            <th width="160">型号</th>
+                            <th width="160">品牌</th>
+                            <th width="100">原数量</th>
+                            <th width="100">新数量</th>
+                            <th width="100">原单价</th>
+                            <th width="100">新单价</th>
+                            <th width="100">原税率</th>
+                            <th width="100">新税率</th>
+                            <th width="100">原交货日期</th>
+                            <th width="100">新交货日期</th>
+                            <th width="130">操作</th>
+                        </tr>
+                        </thead>
+                        <tbody>
+                        <tr ng-repeat="item in change.orderChangeItems">
+                            <td>{{$index+1}}</td>
+                            <td ng-bind="item.oldProduct.title || '-'" title="{{item.oldProduct.title}}"></td>
+                            <td ng-bind="item.oldProduct.cmpCode || '-'" title="{{item.oldProduct.cmpCode}}"></td>
+                            <td ng-bind="item.oldProduct.brand || '-'" title="{{item.oldProduct.brand}}"></td>
+                            <td ng-bind="item.oldQty || '-'" title="{{item.oldQty}}"></td>
+                            <td><input type="text" class="text-center" ng-model="item.newQty" placeholder="新数量"
+                                       ng-pattern="/^(([0-9]+\.[0-9]{1,3})|([0-9]*[0-9][0-9]*\.[0-9]{1,3})|([0-9]*[0-9][0-9]*))$/" value="111"></td>
+                            <td ng-bind="item.oldPrice || '-'" title="{{item.oldPrice}}"></td>
+                            <td><input type="text" class="text-center" ng-model="item.newPrice" placeholder="新单价"
+                                       ng-pattern="/^(([0-9]+\.[0-9]{1,6})|([0-9]*[0-9][0-9]*\.[0-9]{1,6})|([0-9]*[0-9][0-9]*))$/" ></td>
+                            <td ng-bind="item.oldTaxrate || '-'" title="{{item.oldTaxrate}}"></td>
+                            <td><input type="text" class="text-center" ng-model="item.newTaxrate" placeholder="新税率"
+                                       ng-pattern="/^[0-9][0-9]{0,1}$/"></td>
+                            <td ng-bind="item.oldDelivery | date: 'yyyy-MM-dd'" title="{{item.oldDelivery | date: 'yyyy-MM-dd'}}"></td>
+                            <td style="overflow: visible;" id="delivery">
+                                <input ng-model="item.newDelivery" type="text" class="editable"
+                                       placeholder="点击选择时间" datepicker-popup="yyyy-MM-dd" is-open="item.$dateOpen"
+                                       min-date="getMinDate()"
+                                       current-text="今天" clear-text="清除" close-text="关闭"
+                                       datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+                                       ng-focus="openDatePicker($event, $dateOpen)" readonly
+                                       ng-click="openDatePicker($event, item.$dateOpen, $index)">
+                            </td>
+                            <td>
+                                <!--<a ng-click="add($index)" style="color: #1f4fb2">添加</a>-->
+                                <a ng-click="del($index)" style="color: #d32526"> 删除</a>
+                            </td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </div>
+                <div class="save">
+                	<button ng-click="save()" ng-disabled="orderChange.$invalid">提交</button>
+                </div>
+            </div>
+
+    </div>
+</div>
+</form>
+</body>
+</html>

+ 6 - 0
src/main/webapp/resources/tpl/index/purc/left.html

@@ -24,12 +24,18 @@
 	<ul class="list-unstyled">
 		<li ui-sref-active="active"><a ui-sref="purc.order"><em class="new-dot" ng-if="unread.purcOrder > 0"></em>采购订单</a></li>
 	</ul>
+	<ul class="list-unstyled">
+		<li ui-sref-active="active"><a ui-sref="purc.changeList"><em class="new-dot" ng-if="false"></em>采购变更单</a></li>
+	</ul>
 	<ul class="list-unstyled">
 		<li ui-sref-active="active"><a ui-sref="purc.deputy"><em class="new-dot" ng-if="false"></em>代采订单</a></li>
 	</ul>
 	<ul class="list-unstyled">
 		<li ui-sref-active="active"><a ui-sref="purc.makeoutorder"><em class="new-dot" ng-if="false"></em>委外订单</a></li>
 	</ul>
+	<!--<ul class="list-unstyled">-->
+		<!--<li ui-sref-active="active"><a ui-sref="purc.changeList"><em class="new-dot" ng-if="false"></em>采购变更单</a></li>-->
+	<!--</ul>-->
 	<!-- 测试 -->
 	<!-- <ul class="list-unstyled">
 		<li ui-sref-active="active"><a ui-sref="purc.cart">购物车</a></li>

+ 283 - 0
src/main/webapp/resources/tpl/index/purc/modal/enableOrderList.html

@@ -0,0 +1,283 @@
+<style>
+
+.condition .more .form-group {
+	margin-bottom: 0;
+}
+
+.order-table .header>th {
+	height: 38px;
+	text-align: center;
+	background: #f5f5f5;
+	border-top: 1px solid #e8e8e8;
+	border-bottom: 1px solid #e8e8e8;
+}
+
+.toolbar label {
+	margin-right: 10px;
+	margin-bottom: 0;
+}
+
+.order-table .order-hd {
+	background: #f5f5f5;
+	height: 40px;
+	line-height: 40px;
+}
+
+.order-table .order-hd td.first {
+	padding-left: 20px;
+}
+
+.order-table .order-hd .order-main span {
+	margin-right: 8px;
+}
+
+.order-table .order-hd .order-sum {
+	padding: 0 5px;
+}
+.order-table>tbody:hover{
+	border: #3f84f6 2px solid !important;
+}
+
+.order-table .operates i {
+	padding: 0 2px;
+}
+
+.order-table .order-bd {
+	border-bottom: 1px solid #e6e6e6;
+}
+
+.order-table .order-bd>td {
+	padding: 10px 5px;
+	vertical-align: top;
+	position: relative;
+}
+
+.order-table .order-bd .product {
+	padding-left: 20px;
+}
+
+.order-table .order-bd .order-number {
+	position: absolute;
+	top: -1px;
+	left: -1px;
+	width: 20px;
+	height: 20px;
+	line-height: 20px;
+	text-align: center;
+	background: #f5f5f5;
+	font-weight: 500;
+	border: solid 1px #d5d5d5;
+	border-radius: 0 0 10px 0;
+}
+
+.buy-cart a{
+	color: #5078cb;
+	float: left;
+	margin-left: 15px;
+}
+.buy-cart a img{
+	margin-right: 3px;
+}
+.modal-body {
+    max-height: 350px;
+    overflow: auto;
+}
+</style>
+<link rel="stylesheet" href="static/css/public.css">
+<div class="block" id="public">
+    <div class="loading in" ng-class="{'in': loading}"></div>
+    <div class="pub-com_head">
+        <span>采购订单</span>
+        <div class="p-right">
+            <a ng-click="close()" type="button">X</a>
+        </div>
+    </div>
+    <div class="condition block">
+        <div class="search-bg condition block" style="padding: 10px 15px;">
+            <div class="row">
+                <div id="topSearch" style="float: left">
+                    <a ng-click="changeDateZone(1);condition.$open=false" title="最近一个月"
+                       ng-class="{'active':condition.dateZone=='1'}">最近一个月</a>
+                    <a ng-click="changeDateZone(3);condition.$open=false" title="最近三个月"
+                       ng-class="{'active':condition.dateZone=='3'}">最近三个月</a>
+                    <a ng-click="changeDateZone(6);condition.$open=false" title="最近六个月"
+                       ng-class="{'active':condition.dateZone=='6'}">最近六个月</a>
+                    <a ng-click="condition.$open=!condition.$open;changeDateZone(-1)" title="自定义"
+                       ng-class="{'active':condition.dateZone=='-1'}">自定义</a>
+                </div>
+                <div class="col-xs-6" style="float: right;">
+                    <div class="search">
+                        <div class="form-group form-group-sm has-feedback" dropdown auto-close="outsideClick"
+                             on-toggle="searchAdvance=open">
+                            <input type="search" class="form-control input-sm" ng-model="keyword"
+                                   ng-search="onSearch(keyword)" placeholder="输入单据编号、客户名称、物料名称搜索" style="width: 100%"/>
+                            <a class="btn input-group-addon" ng-click="onSearch(keyword)">搜索</a>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="more-list more" ng-class="{'open': condition.$open}">
+                <form class="form-inline">
+                    <div class="form-group ">
+                        <label>日期:</label>
+                        <div class="btn-group btn-menu" dropdown is-open="condition.$dateZoneOpen">
+                            <ul class="dropdown-menu">
+                                <li><a ng-click="changeDateZone(1)">一个月内</a></li>
+                                <li><a ng-click="changeDateZone(6)">半年内</a></li>
+                                <li><a ng-click="changeDateZone()">半年前</a></li>
+                            </ul>
+                        </div>
+                        <div class="form-group input-group input-group-xs input-trigger">
+                            <input type="text" ng-model="condition.dateFrom"
+                                   class="form-control" placeholder="从"
+                                   datepicker-popup="yyyy-MM-dd" is-open="condition.$fromOpened"
+                                   ng-required="true" max-date="condition.dateTo"
+                                   current-text="今天" clear-text="清除" close-text="关闭"
+                                   datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+                                   ng-focus="openFilterDatePicker($event, condition, '$fromOpened')">
+                            <span class="input-group-btn">
+						<button type="button" class="btn btn-default"
+                                ng-click="openFilterDatePicker($event, condition, '$fromOpened')">
+							<i class="fa fa-calendar"></i>
+						</button>
+					</span>
+                        </div>
+                        <div class="form-group input-group input-group-xs input-trigger">
+                            <input type="text" ng-model="condition.dateTo"
+                                   class="form-control" placeholder="到"
+                                   datepicker-popup="yyyy-MM-dd" is-open="condition.$toOpened"
+                                   ng-required="true" min-date="condition.dateFrom"
+                                   current-text="今天" clear-text="清除" close-text="关闭"
+                                   datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+                                   ng-focus="openFilterDatePicker($event, condition, '$toOpened')">
+                            <span class="input-group-btn">
+						<button type="button" class="btn btn-default"
+                                ng-click="openFilterDatePicker($event, condition, '$toOpened')">
+							<i class="fa fa-calendar"></i>
+						</button>
+					</span>
+                        </div>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+    <div class="modal-body">
+        <table class="order-table block" ng-table="tableParams">
+            <thead>
+                <tr class="header">
+                    <th width="50">选择</th>
+                    <th>物料</th>
+                    <th width="80">含税单价</th>
+                    <th width="100">税率</th>
+                    <th width="100">数量</th>
+                    <th width="120">交货日期</th>
+                </tr>
+            </thead>
+            <tbody ng-if="tableParams.total() == 0">
+            <tr>
+                <td colspan="6">
+                    <div id="empty">
+                        <div class="left_img">
+                            <a href="http://www.ubtob.com/" target="_blank" title="优软云首页"><img
+                                    src="static/img/empty/uas_empty.png"></a>
+                            <a href="#/index" title="B2B商务首页">B2B 商务</a>
+                        </div>
+                        <div class="right_link">
+                            <p>当前没有对应的采购订单!</p>
+                        </div>
+                    </div>
+                </td>
+            </tr>
+            <tr>
+                <td colspan="6">
+                    <div id="empty_info">
+                        <div class="f16 text-center empty_title">
+                            <p>为什么我没有采购订单?</p>
+                        </div>
+                        <div class="f14 empty_explain">
+                            <div class="info">
+                                <p>1、您的采购单在ERP系统上还没审核,订单无法上传到平台<br>
+                                    解决:采购员沟通确认单据是否已经审核(只有ERP中已经审核的单据才能接收到)</p>
+                            </div>
+                            <div class="info">
+                                <p>2、ERP中供应商信息有误<br>
+                                    解决:与您的供应商沟通确认他的资料在供应商资料中是否维护正确,尤其是企业UU号</p>
+                            </div>
+                            <div class="info">
+                                <p>3、您的供应商正在使用旧版本的UAS商务平台<br>
+                                    解决:我们仍有部分用户在使用旧版本UAS商务平台系统,你可以用您的企业UU号和管理员个人UU号
+                                    <a href="http://www.usoftchina.com" class="text-bold text-link"
+                                       title="http://www.usoftchina.com" target="_blank">登陆旧版本UAS商务平台</a>
+                                </p>
+                            </div>
+                        </div>
+                    </div>
+                </td>
+            </tr>
+            </tbody>
+            <tbody ng-repeat="order in $data" class="item-body">
+            <tr class="order-hd"
+                ng-class="{'text-bold': order.display>0}">
+                <td class="text-center">
+                    <input type="checkbox" ng-click="checkOne(order)" ng-model="!item.change && order.checked" >
+                </td>
+                <td class="first" colspan="4">
+                    <div class="order-main">
+					<span class="text-num text-bold"
+                          ng-bind="::order.date | date:'yyyy-MM-dd'"></span>
+                        <span>订单号:<a
+                                class="text-num" ng-bind="::order.code" target="_self"></a></span>
+                        <span ng-bind="::order.receiveName"></span>
+                    </div>
+                </td>
+                <td class="order-sum">{{::order.currency}}: <span
+                        ng-bind="getCartTotal(order.orderItems) | number : 2"
+                        class="text-num text-bold"></span>
+                </td>
+            </tr>
+            <tr class="order-bd" ng-repeat="item in order.orderItems">
+                <td class="text-center">
+                    <input type="checkbox" ng-click="checkItem(item, order, $index)" ng-model="!item.change && item.checked">
+                </td>
+                <td class="product">
+                    <div class="text-num order-number" ng-class="{'key': item.key&&order.$showAll}"
+                         title="第{{::item.number}}行">{{::item.number}}
+                    </div>
+                    <div class="text-num text-bold">
+                        <span ng-bind="::item.product.code"></span>
+                    </div>
+                    <div>
+                        <span ng-bind="::item.product.title"></span>
+                    </div>
+                    <div class="text-muted"
+                         ng-bind="::item.product.spec"></div>
+                    <div class="text-muted text-bold" ng-if="item.vendspec"><span ng-bind="::item.vendspec"></span>
+                    </div>
+                    <div class="text-bold text-inverse" ng-if="item.factory">送货工厂:<span ng-bind="::item.factory"></span>
+                    </div>
+                    <div class="text-bold text-inverse" ng-if="item.remark">备注:<span ng-bind="::item.remark"></span>
+                    </div>
+                </td>
+                <td class="text-center">
+                    <div class="text-num" ng-bind="::item.price | number:6"></div>
+                </td>
+                <td class="text-center">
+                    <div class="text-muted">{{::item.taxrate || 0}}</div>
+                </td>
+                <td class="text-center">
+                    <div class="text-num" ng-bind="::item.qty"></div>
+                    <div class="text-muted" ng-bind="::item.product.unit"></div>
+                </td>
+                <td class="text-center br-l">
+                    <div class="text-num" ng-bind="::item.delivery | date:'yyyy-MM-dd'"></div>
+                </td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+    <div class="modal-footer">
+        <a class="btn btn-success btn-sm" ng-click="choose()">确定</a>
+        <a class="btn btn-danger btn-sm" ng-click="close()"> 取消</a>
+    </div>
+</div>

+ 45 - 19
src/main/webapp/resources/tpl/index/sale/change.html

@@ -279,7 +279,8 @@
 			<td colspan="6" class="order-info">
 				 <span><span class="text-bold">币别:</span>
 				 	<span ng-class="{'text-inverse': change.newCurrency != change.oldCurrency}" ng-bind="::change.newCurrency"></span>&nbsp;
-				 	<s class="text-muted" ng-if="change.newCurrency != change.oldCurrency" ng-bind="::change.oldCurrency"></s>&nbsp;&nbsp;&nbsp;&nbsp;
+				 	<s class="text-muted" ng-if="(change.newCurrency != change.oldCurrency) && (change.newCurrency != null)" ng-bind="::change.oldCurrency"></s>
+					<s class="text-muted" ng-if="(change.newCurrency != change.oldCurrency) && (change.newCurrency == null)" ng-bind="::change.oldCurrency"></s>
 				 </span>
 				<!-- <span><span class="text-bold">汇率:</span>
 				 	<span ng-class="{'text-inverse': change.newRate != change.oldRate}" ng-bind="::change.newRate"></span>&nbsp;
@@ -287,11 +288,13 @@
 				 </span>-->
 				 <span><span class="text-bold">支付方式:</span>
 				 	<span ng-class="{'text-inverse': change.newPayments != change.oldPayments}" ng-bind="::change.newPayments"></span>&nbsp;
-				 	<s class="text-muted" ng-if="change.newPayments != change.oldPayments" ng-bind="::change.oldPayments"></s>&nbsp;&nbsp;&nbsp;&nbsp;
+				 	<s class="text-muted" ng-if="(change.newPayments != change.oldPayments) && (change.newPayments != null)" ng-bind="::change.oldPayments"></s>
+					<s class="text-muted" ng-if="(change.newPayments != change.oldPayments) && (change.newPayments == null)" ng-bind="::change.oldPayments"></s>&nbsp;&nbsp;&nbsp;&nbsp;
 				 </span>
-				<span><span class="text-bold" ng-if="change.newApVendorName">应付供应商:</span>
-				 	<span ng-class="{'text-inverse': change.apVendorName != change.newApVendorName}" ng-bind="::change.newApVendorName"></span>&nbsp;
-				 	<s class="text-muted" ng-if="change.apVendorName != change.newApVendorName" ng-bind="::change.apVendorName"></s>
+				<span><span class="text-bold" ng-if="change.newApVendorName || change.newApVendorName == null">应付供应商:</span>
+				 	<span ng-class="{'text-inverse': change.apVendorName != change.newApVendorName && change.newApVendorName != null}" ng-bind="::change.newApVendorName"></span>&nbsp;
+				 	<s class="text-muted" ng-if="(change.apVendorName != change.newApVendorName)  && (change.newApVendorName != null)" ng-bind="::change.apVendorName"></s>
+					<span ng-if="change.apVendorName != change.newApVendorName  && change.newApVendorName == null" ng-bind="::change.apVendorName"></span>
 				</span>
 			</td>
 		</tr>
@@ -324,55 +327,78 @@
 		</tr>
 		<tr class="order-bd" ng-repeat="item in ::change.orderChangeItems">
 			<td class="product">
-				<div>
-					<span class="text-num text-bold" ng-class="{'text-inverse': item.oldProduct.code != item.newProduct.code}" ng-bind="::item.newProduct.code"></span><span class="text-muted">(型号)</span>
+				<div ng-show = "item.oldProduct.code != item.newProduct.code && item.newProduct.code != null">
+					<span class="text-num text-bold" ng-class="{'text-inverse': item.oldProduct.code != item.newProduct.code && item.newProduct.code != null}" ng-bind="::item.newProduct.code"></span><span class="text-muted">(型号)</span>
+					<span class="text-light">&nbsp;&nbsp;&nbsp;订单第 <span class="text-num">{{::item.orderItemNumber}}</span> 行</span>
+				</div>
+				<div ng-show = "item.oldProduct.code == item.newProduct.code || item.newProduct.code == null">
+					<span class="text-num text-bold"  ng-bind="::item.oldProduct.code"></span><span class="text-muted">(型号)</span>
 					<span class="text-light">&nbsp;&nbsp;&nbsp;订单第 <span class="text-num">{{::item.orderItemNumber}}</span> 行</span>
 				</div>
-				<div ng-show="item.oldProduct.code != item.newProduct.code">
+				<div ng-show="(item.oldProduct.code != item.newProduct.code) && (item.newProduct.code != null) ">
 					<s class="text-num text-bold"  ng-bind="::item.oldProduct.code"></s>
 				</div>
-				<div>
-					<span ng-class="{'text-inverse': item.oldProduct.title != item.newProduct.title}" ng-bind="::item.newProduct.title"></span><span class="text-muted">(名称)</span>
+				<div ng-show="item.oldProduct.title != item.newProduct.title && item.newProduct.title != null">
+					<span ng-class="{'text-inverse': item.oldProduct.title != item.newProduct.title && item.newProduct.title != null}" ng-bind="::item.newProduct.title"></span><span class="text-muted">(名称)</span>
 				</div>
-				<div><s ng-show="item.oldProduct.title != item.newProduct.title" ng-bind="::item.oldProduct.title"></s></div>
-				<div>
-					<span ng-class="{'text-inverse': item.oldProduct.spec != item.newProduct.spec}" ng-bind="::item.newProduct.spec"></span><span class="text-muted">(规格)</span>
+				<div ng-show="item.oldProduct.title == item.newProduct.title || item.newProduct.title == null">
+					<span  ng-bind="::item.oldProduct.title"></span><span class="text-muted">(名称)</span>
+				</div>
+				<div><s ng-show="((item.oldProduct.title != item.newProduct.title) && (item.newProduct.title != null))" ng-bind="::item.oldProduct.title"></s></div>
+				<div ng-show="item.oldProduct.spec != item.newProduct.spec && item.newProduct.spec != null">
+					<span ng-class="{'text-inverse': item.oldProduct.spec != item.newProduct.spec && item.newProduct.spec != null}" ng-bind="::item.newProduct.spec"></span><span class="text-muted">(规格)</span>
 				</div>
-				<div><s class="text-muted" ng-show="item.oldProduct.spec != item.newProduct.spec" ng-bind="::item.oldProduct.spec"></s></div>
+				<div ng-show="item.newProduct.spec == item.oldProduct.spec || item.newProduct.spec == null">
+					<span  ng-bind="::item.oldProduct.spec"></span><span class="text-muted">(规格)</span>
+				</div>
+				<div><s class="text-muted" ng-show="((item.oldProduct.spec != item.newProduct.spec) && (item.newProduct.spec != null))" ng-bind="::item.oldProduct.spec"></s></div>
 			</td>
 			<td class="text-center">
 				<div class="text-num" ng-if="!isUser"
 					ng-class="{'text-inverse': item.newPrice != item.oldPrice}"
 					title="{{item.newPrice}}" ng-bind="::item.newPrice | number:6"></div>
 				<div ng-if="isUser" ng-class="{'text-inverse': item.newPrice != item.oldPrice}">-</div>
-				<div ng-show="item.newPrice != item.oldPrice">
+				<div ng-show="(item.newPrice != item.oldPrice) && (item.newPrice != null)">
 					<s ng-if="!isUser" class="text-num text-muted" ng-bind="::item.oldPrice | number:6"></s>
 					<s ng-if="isUser" class="text-num text-muted" >-</s>
 				</div>
+				<div ng-show="(item.newPrice != item.oldPrice) && (item.newPrice == null)">
+					<span ng-if="!isUser"  ng-bind="::item.oldPrice | number:6"></span>
+					<span ng-if="isUser"  >-</span>
+				</div>
 				<div class="text-muted">
-					税率 <span class="text-num" ng-class="{'text-inverse': item.newTaxrate != item.oldTaxrate}">
+					税率 <span ng-show="item.newTaxrate != item.oldTaxrate && item.newTaxrate != null"><span class="text-num" ng-class="{'text-inverse': item.newTaxrate != item.oldTaxrate && item.newTaxrate != null}">
 						{{::item.newTaxrate}}%
-					</span> <s ng-if="item.newTaxrate != item.oldTaxrate">{{::item.oldTaxrate}}%</s>
+					</span> </span><s ng-if="(item.newTaxrate != item.oldTaxrate) && (item.newTaxrate != null)">{{::item.oldTaxrate}}%</s>
+					<span ng-if="(item.newTaxrate != item.oldTaxrate) && (item.newTaxrate == null)">{{::item.oldTaxrate}}%</span>
 				</div>
 			</td>
 			<td class="text-center">
 				<div class="text-num"
 					ng-class="{'text-inverse': item.newQty != item.oldQty}"
 					title="{{item.newQty}}" ng-bind="::item.newQty"></div>
-				<div ng-show="item.newQty != item.oldQty">
+				<div ng-show="item.newQty != item.oldQty  && item.newQty != null">
 					<s class="text-num text-muted" title="{{item.oldQty}}"
 						ng-bind="::item.oldQty"></s>
 				</div>
+				<div ng-show="item.newQty != item.oldQty && item.newQty == null">
+					<span  title="{{item.oldQty}}"
+						   ng-bind="::item.oldQty"></span>
+				</div>
 				<div class="text-muted" ng-bind="::item.newProduct.unit"></div>
 			</td>
 			<td class="text-center br-l">
 				<div class="text-num"
 					ng-class="{'text-inverse': item.newDelivery != item.oldDelivery}"
 					ng-bind="::item.newDelivery | date:'yyyy-MM-dd'"></div>
-				<div ng-show="item.newDelivery != item.oldDelivery">
+				<div ng-show="item.newDelivery != item.oldDelivery && item.newDelivery != null">
 					<s class="text-num text-muted"
 						ng-bind="::item.oldDelivery | date:'yyyy-MM-dd'"></s>
 				</div>
+				<div ng-show="item.newDelivery != item.oldDelivery && item.newDelivery == null">
+					<span
+							ng-bind="::item.oldDelivery | date:'yyyy-MM-dd'"></span>
+				</div>
 			</td>
 			<td class="text-center br-l" colspan="2">
 				<div ng-bind="::item.description"></div>

+ 43 - 17
src/main/webapp/resources/tpl/index/sale/change_detail.html

@@ -79,8 +79,10 @@
 				<div class="content">
 					<span ng-class="{'text-inverse': change.newCurrency != change.oldCurrency}"
 						ng-bind="::change.newCurrency"></span> 
-					<s ng-show="change.newCurrency != change.oldCurrency"
+					<s ng-show="(change.newCurrency != change.oldCurrency)  && (change.newCurrency != null)"
 						class="text-muted" ng-bind="::change.oldCurrency"></s>
+					<span ng-show="(change.newCurrency != change.oldCurrency)  && (change.newCurrency == null)"
+						  ng-bind="::change.oldCurrency"></span>
 				</div>
 			</div>
 			<div class="col-xs-3">
@@ -89,8 +91,10 @@
 					<span
 						ng-class="{'text-inverse': change.newRate != change.oldRate}"
 						ng-bind="::change.newRate"></span> <s
-						ng-show="change.newRate != change.oldRate" class="text-muted"
-						ng-bind="::change.oldRate"></s>
+						ng-show="(change.newRate != change.oldRate) && (change.newRate != null)" class="text-muted"
+						ng-bind="::change.oldRate"></s> <span
+						ng-show="(change.newRate != change.oldRate)  && (change.newRate == null)"
+						ng-bind="::change.oldRate"></span>
 				</div>
 			</div>
 			<div class="col-xs-6">
@@ -98,15 +102,18 @@
 				<div class="content">
 					<span ng-class="{'text-inverse': change.newPayments != change.oldPayments}"
 						ng-bind="::change.newPayments"></span> 
-					<s ng-show="change.newPayments != change.oldPayments"
+					<s ng-show="change.newPayments != change.oldPayments && change.newPayments != null"
 						class="text-muted" ng-bind="::change.oldPayments"></s>
+					<span ng-show="change.newPayments != change.oldPayments && change.newPayments == null"
+						  ng-bind="::change.oldPayments"></span>
 				</div>
 			</div>
 			<div class="col-xs-12">
 				<span class="title" ng-if="change.newApVendorName">应付供应商</span>
 				<div class="content">
 				 	<span ng-class="{'text-inverse': change.apVendorName != change.newApVendorName}" ng-bind="::change.newApVendorName"></span>&nbsp;
-				 	<s class="text-muted" ng-if="change.apVendorName != change.newApVendorName" ng-bind="::change.apVendorName"></s>
+				 	<s class="text-muted" ng-if="(change.apVendorName != change.newApVendorName) && (change.newApVendorName != null)" ng-bind="::change.apVendorName"></s>
+
 				</div>
 			</div>
 		</div>
@@ -162,21 +169,31 @@
 				<tbody>
 					<tr ng-repeat="item in change.orderChangeItems track by item.id">
 						<td width="380">
-							<div>
+							<div ng-show="(item.oldProduct.code != item.newProduct.code) && (item.newProduct.code != null)">
 								<span class="text-num text-bold" ng-class="{'text-inverse': item.oldProduct.code != item.newProduct.code}" ng-bind="::item.newProduct.code"></span><span class="text-muted">(型号)</span>
 								<span class="text-light">&nbsp;&nbsp;&nbsp;订单第 <span class="text-num">{{::item.orderItemNumber}}</span> 行</span>
 							</div>
-							<div ng-show="item.oldProduct.code != item.newProduct.code">
+							<div ng-show="item.newProduct.code == item.oldProduct.code || item.newProduct.code == null">
+								<span class="text-num text-bold"  ng-bind="::item.oldProduct.code"></span><span class="text-muted">(型号)</span>
+								<span class="text-light">&nbsp;&nbsp;&nbsp;订单第 <span class="text-num">{{::item.orderItemNumber}}</span> 行</span>
+							</div>
+							<div ng-show="(item.oldProduct.code != item.newProduct.code) && (item.newProduct.code != null)">
 								<s class="text-num text-bold"  ng-bind="::item.oldProduct.code"></s>
 							</div>
-							<div>
+							<div ng-show="(item.oldProduct.title != item.newProduct.title) && (item.newProduct.title != null)">
 								<span ng-class="{'text-inverse': item.oldProduct.title != item.newProduct.title}" ng-bind="::item.newProduct.title"></span><span class="text-muted">(名称)</span>
 							</div>
-							<div><s ng-show="item.oldProduct.title != item.newProduct.title" ng-bind="::item.oldProduct.title"></s></div>
-							<div>
+							<div ng-show="item.newProduct.title == item.oldProduct.title || item.newProduct.title == null">
+								<span  ng-bind="::item.oldProduct.title"></span><span class="text-muted">(名称)</span>
+							</div>
+							<div><s ng-show="(item.oldProduct.title != item.newProduct.title) && (item.newProduct.title != null)" ng-bind="::item.oldProduct.title"></s></div>
+							<div ng-show="(item.oldProduct.spec != item.newProduct.spec) && (item.newProduct.spec != null)">
 								<span ng-class="{'text-inverse': item.oldProduct.spec != item.newProduct.spec}" ng-bind="::item.newProduct.spec"></span><span class="text-muted">(规格)</span>
 							</div>
-							<div><s class="text-muted" ng-show="item.oldProduct.spec != item.newProduct.spec" ng-bind="::item.oldProduct.spec"></s></div>
+							<div ng-show="item.newProduct.spec == item.oldProduct.spec || item.newProduct.spec == null)">
+								<span  ng-bind="::item.oldProduct.spec"></span><span class="text-muted">(规格)</span>
+							</div>
+							<div><s class="text-muted" ng-show="(item.oldProduct.title != item.newProduct.title) && (item.newProduct.title != null)" ng-bind="::item.oldProduct.spec"></s></div>
 						</td>
 						<td class="text-center" width="100">
 							<div class="text-num" ng-if="!isUser"
@@ -188,32 +205,41 @@
 								<s ng-if="isUser" class="text-num text-muted" >-</s>
 							</div>
 							<div class="text-muted">
-								税率 <span class="text-num" ng-class="{'text-inverse': item.newTaxrate != item.oldTaxrate}">
-									{{::item.newTaxrate}}%
-								</span> <s ng-if="item.newTaxrate != item.oldTaxrate">{{::item.oldTaxrate}}%</s>
+								税率 <span ng-show="item.newTaxrate != item.oldTaxrate && item.newTaxrate != null"><span class="text-num" ng-class="{'text-inverse': item.newTaxrate != item.oldTaxrate && item.newTaxrate != null}">
+						{{::item.newTaxrate}}%
+					</span> </span><s ng-if="(item.newTaxrate != item.oldTaxrate) && (item.newTaxrate != null)">{{::item.oldTaxrate}}%</s>
+								<span ng-if="(item.newTaxrate != item.oldTaxrate) && (item.newTaxrate == null)">{{::item.oldTaxrate}}%</span>
 							</div>
 						</td>
 						<td class="text-center" width="60">
 							<div class="text-num"
 								ng-class="{'text-inverse': item.newQty != item.oldQty}"
 								title="{{item.newQty}}" ng-bind="::item.newQty"></div>
-							<div ng-show="item.newQty != item.oldQty">
+							<div ng-show="item.newQty != item.oldQty && item.newQty != null">
 								<s class="text-num text-muted" title="{{item.oldQty}}"
 									ng-bind="::item.oldQty"></s>
 							</div>
+							<div ng-show="item.newQty != item.oldQty && item.newQty == null">
+								<span  title="{{item.oldQty}}"
+									   ng-bind="::item.oldQty"></span>
+							</div>
 							<div class="text-muted" ng-bind="::item.newProduct.unit"></div>
 						</td>
 						<td class="text-center" width="120">
 							<div class="text-num"
 								ng-class="{'text-inverse': item.newDelivery != item.oldDelivery}"
 								ng-bind="::item.newDelivery | date:'yyyy-MM-dd'" style="width: 100%"></div>
-							<div ng-show="item.newDelivery != item.oldDelivery">
+							<div ng-show="item.newDelivery != item.oldDelivery && item.newDelivery != null">
 								<s class="text-num text-muted"
 									ng-bind="::item.oldDelivery | date:'yyyy-MM-dd'"></s>
 							</div>
+							<div ng-show="item.newDelivery != item.oldDelivery && item.newDelivery == null">
+					<span
+							ng-bind="::item.oldDelivery | date:'yyyy-MM-dd'"></span>
+							</div>
 						</td>
 						<td colspan="2" width="210">
-							<div ng-bind="::item.description"></div>
+							<div ng-bind="change.description"></div>
 							<div ng-if="change.agreed == 1" class="block">
 								<span class="text-trans success">已同意</span>
 							</div>

+ 1 - 1
src/main/webapp/resources/tpl/index/sale/order_detail.html

@@ -67,7 +67,7 @@
 			</div>
 			<div class="col-xs-9">
 				<span class="title">备注:</span>
-				<div class="content" ng-bind="::order.remark"></div>
+				<div class="content" ng-bind="::order.remark" style="white-space: normal;word-break: break-word;word-wrap: break-word;margin-left: 75px;margin-top: -25px;line-height: 25px;">1</div>
 			</div>
 			<!-- <div class="col-xs-6">
 				<span class="title">审批人:</span>