瀏覽代碼

Merge branch 'master' of ssh://10.10.101.21/source/platform-b2b into release-hejq-201846

hejq 7 年之前
父節點
當前提交
2830ff4d61
共有 24 個文件被更改,包括 988 次插入284 次删除
  1. 48 1
      db/ddl.sql
  2. 68 0
      src/main/java/com/uas/platform/b2b/erp/model/PurchaseDetail.java
  3. 15 2
      src/main/java/com/uas/platform/b2b/erp/service/impl/PurchaseProdInOutServiceImpl.java
  4. 95 133
      src/main/java/com/uas/platform/b2b/filter/SSOInterceptor.java
  5. 1 0
      src/main/java/com/uas/platform/b2b/model/ErpProdIODetail.java
  6. 82 0
      src/main/java/com/uas/platform/b2b/model/PurcOrderInfoItem.java
  7. 82 0
      src/main/java/com/uas/platform/b2b/model/PurchaseOrderAllItem.java
  8. 82 0
      src/main/java/com/uas/platform/b2b/model/PurchaseOrderDoneItem.java
  9. 42 0
      src/main/java/com/uas/platform/b2b/model/PurchaseOrderEnd.java
  10. 82 0
      src/main/java/com/uas/platform/b2b/model/PurchaseOrderItem.java
  11. 81 0
      src/main/java/com/uas/platform/b2b/model/PurchaseOrderTodoItem.java
  12. 81 0
      src/main/java/com/uas/platform/b2b/model/PurchaseOrderWaitingItem.java
  13. 10 4
      src/main/java/com/uas/platform/b2b/model/User.java
  14. 4 0
      src/main/java/com/uas/platform/b2b/service/impl/ErpProdIODetailServiceImpl.java
  15. 12 6
      src/main/java/com/uas/platform/b2b/support/UserCreater.java
  16. 18 22
      src/main/java/com/uas/platform/b2b/v2/service/impl/EnterpriseServiceImpl.java
  17. 3 3
      src/main/java/com/uas/platform/b2b/v2/service/impl/UserServiceImpl.java
  18. 42 10
      src/main/webapp/resources/tpl/index/purc/order.html
  19. 6 3
      src/main/webapp/resources/tpl/index/purc/order_detail.html
  20. 10 10
      src/main/webapp/resources/tpl/index/sale/accept.html
  21. 39 3
      src/main/webapp/resources/tpl/index/sale/notice.html
  22. 42 80
      src/main/webapp/resources/tpl/index/sale/order.html
  23. 10 7
      src/main/webapp/resources/tpl/index/sale/order_detail.html
  24. 33 0
      src/test/java/com/uas/platform/b2b/purc/PurchaseNotify.java

+ 48 - 1
db/ddl.sql

@@ -17,6 +17,22 @@
 -- author: hejq
 -- 更新purc$vendors 字段todo_apchek_count长度
   alter table purc$vendors modify todo_apchek_count varchar(200);
+-- date: 2018-12-19 09:51
+-- author: huj
+-- content: 采购明细单增加替代料号、替代料名称、替代料规格三个字段(帝显LED物料需求)
+  alter table `purc$orderitems`
+  add column pd_repprodcode VARCHAR(255)  comment '替代料号',
+  add column pd_repprodtitle VARCHAR(255)  comment '替代料名称',
+  add column pd_repprodspec VARCHAR(255)  comment '替代料规格';
+
+-- date: 2018-12-25 10:51
+-- author: huj
+-- content: 采购明细单增加旧料编号、旧料名称、旧料规格三个字段(帝显LED物料需求)
+alter table `purc$orderitems`
+  add column pd_prodoldcode VARCHAR(255)  comment '旧料编号',
+  add column pd_prodoldtitle VARCHAR(255)  comment '旧料名称',
+  add column pd_prodoldspec VARCHAR(255)  comment '旧料规格';
+
 
 -- date: 2018-12-20 11:34
 -- author: hejq
@@ -93,4 +109,35 @@ pd_vdid in (select ve_id from `purc$vendors` where ve_myenuu = 10042875);
 -- author: hejq
 -- content: 供应商客户关系表增加对账总额字段
 alter table `purc$vendors`
-  add column apcheck_count VARCHAR(200) default '' comment '对账总额(已对账和未对账之和)';
+  add column apcheck_count VARCHAR(200) default '' comment '对账总额(已对账和未对账之和)';
+
+-- date: 2018-12-28 17:19
+-- author: hejq
+-- content: 更新发货提醒判断逻辑
+-- 新增函数,返回可发货日期
+CREATE DEFINER=`sa`@`%` FUNCTION `b2b_mysql_test`.`purc_notice_delivery`(v_pn_delivery date,
+                                                                         v_pr_ltinstock int) RETURNS date
+  begin
+
+    if v_pr_ltinstock = -1 then
+      -- 	这里设置减去两个月最后一天再加上26天即指定月份的26号
+      return last_day(v_pn_delivery) + interval (-2) month + interval (26) day;
+    else
+      return v_pn_delivery - interval (v_pr_ltinstock + 1) day;
+    end if;
+  end;
+-- 更新判断方法,根据生成的可发货日期与当前日期比较,大于或等于可以发货,其他状态不能发货
+CREATE DEFINER=`sa`@`%` FUNCTION `b2b_mysql_test`.`PURC_NOTICE_WAIT_TO_SEND`(v_pn_delivery date,
+    v_pr_ltinstock int) RETURNS smallint(6)
+begin
+-- 	可以发货的时间
+declare enable_delivery date;
+
+set enable_delivery := purc_notice_delivery(v_pn_delivery, coalesce(v_pr_ltinstock, 0));
+
+if to_days(current_date()) - to_days(enable_delivery) >= 0 then
+return 0;
+else
+return 1;
+end if;
+end

+ 68 - 0
src/main/java/com/uas/platform/b2b/erp/model/PurchaseDetail.java

@@ -58,6 +58,68 @@ public class PurchaseDetail {
 	private String pd_orispeccode;
 	private List<Attach> attaches;
 
+	//替代料号
+	private String pd_repprodcode;
+	//替代料名称
+	private String pd_repdetail;
+	//替代料规格
+	private String pd_repspec;
+
+	//旧料编号
+	private String pr_oldcode;
+	//旧料名称
+	private String pr_oldname;
+	//旧料规格
+	private String pr_oldspec;
+
+	public String getPr_oldcode() {
+		return pr_oldcode;
+	}
+
+	public void setPr_oldcode(String pr_oldcode) {
+		this.pr_oldcode = pr_oldcode;
+	}
+
+	public String getPr_oldname() {
+		return pr_oldname;
+	}
+
+	public void setPr_oldname(String pr_oldname) {
+		this.pr_oldname = pr_oldname;
+	}
+
+	public String getPr_oldspec() {
+		return pr_oldspec;
+	}
+
+	public void setPr_oldspec(String pr_oldspec) {
+		this.pr_oldspec = pr_oldspec;
+	}
+
+	public String getPd_repprodcode() {
+		return pd_repprodcode;
+	}
+
+	public void setPd_repprodcode(String pd_repprodcode) {
+		this.pd_repprodcode = pd_repprodcode;
+	}
+
+	public String getPd_repdetail() {
+		return pd_repdetail;
+	}
+
+	public void setPd_repdetail(String pd_repdetail) {
+		this.pd_repdetail = pd_repdetail;
+	}
+
+	public String getPd_repspec() {
+		return pd_repspec;
+	}
+
+	public void setPd_repspec(String pd_repspec) {
+		this.pd_repspec = pd_repspec;
+	}
+
 	public String getPd_taxcode() {
 		return pd_taxcode;
 	}
@@ -298,6 +360,12 @@ public class PurchaseDetail {
 		item.setTaxCode(this.pd_taxcode);
 		item.setBillName(this.pd_billname);
 		item.setOriSpecCode(this.pd_orispeccode);
+		item.setRepProdCode(this.pd_repprodcode);
+		item.setRepProdTitle(this.pd_repdetail);
+		item.setRepProdSpec(this.pd_repspec);
+		item.setProdOldCode(this.pr_oldcode);
+		item.setProdOldTitle(this.pr_oldname);
+		item.setProdOldSpec(this.pr_oldspec);
 		if (!CollectionUtils.isEmpty(this.attaches)) {
 			Set<com.uas.platform.b2b.model.Attach> b2bAttaches = new HashSet<com.uas.platform.b2b.model.Attach>();
 			for(Attach attach : this.attaches) {

+ 15 - 2
src/main/java/com/uas/platform/b2b/erp/service/impl/PurchaseProdInOutServiceImpl.java

@@ -126,7 +126,13 @@ public class PurchaseProdInOutServiceImpl implements PurchaseProdInOutService {
                         item.setAccept(existAccept);
                         item.setErpDate(new Date(System.currentTimeMillis()));
                         ProductInfo productInfo = products.get(item.getProdcode());
-                        item.setProduct(productInfo);
+						// 如果物料库存在该物料
+						if (!org.springframework.util.StringUtils.isEmpty(productInfo)) {
+							item.setProduct(productInfo);
+							item.setProdId(productInfo.getId());
+						} else {
+							item.setProduct(purchaseOrderItems.get(0).getProduct());
+						}
                         acceptItems.add(item);
                     } else {
                         if (StringUtils.isEmpty(uuid)) {
@@ -188,6 +194,7 @@ public class PurchaseProdInOutServiceImpl implements PurchaseProdInOutService {
                     List<PurchaseOrderItem> purchaseOrderItems = purchaseOrderItemDao
                             .findByEnUUAndOrderCodeAndNumber(enUU, item.getOrderItem().getOrder().getCode(),
                                     item.getOrderItem().getNumber());
+					ProductInfo productInfo = products.get(item.getProdcode());
                     // 对应的采购单存在
                     if (purchaseOrderItems.size() > 0) {
                         // 对应的采购单明细set进去
@@ -196,7 +203,13 @@ public class PurchaseProdInOutServiceImpl implements PurchaseProdInOutService {
                         // 设置主记录
                         item.setAccept(accept);
                         item.setErpDate(new Date());
-                        item.setProduct(purchaseOrderItems.get(0).getProduct());
+                        // 如果物料库存在该物料
+						if (!org.springframework.util.StringUtils.isEmpty(productInfo)) {
+							item.setProduct(productInfo);
+							item.setProdId(productInfo.getId());
+						} else {
+							item.setProduct(purchaseOrderItems.get(0).getProduct());
+						}
                         acceptItems.add(item);
                     } else {
                         if (StringUtils.isEmpty(uuid)) {

+ 95 - 133
src/main/java/com/uas/platform/b2b/filter/SSOInterceptor.java

@@ -13,7 +13,6 @@ import com.uas.platform.b2b.service.EnterpriseService;
 import com.uas.platform.b2b.service.RoleService;
 import com.uas.platform.b2b.service.SigninLogService;
 import com.uas.platform.b2b.service.UserService;
-import com.uas.platform.b2b.support.CollectionUtil;
 import com.uas.platform.b2b.support.SecurityConstant;
 import com.uas.platform.b2b.support.SysConf;
 import com.uas.platform.b2b.support.SystemSession;
@@ -57,11 +56,10 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 /**
  * 访问拦截
- * 
+ *
  * @author hejq
  * @date 2018-07-18 19:21
  */
@@ -108,10 +106,6 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
 	private HashMap<String, Collection<ConfigAttribute>> resourceMap;
 	private HashMap<Long, Collection<GrantedAuthority>> authorities;
 
-    private final static String TOKEN_PARAM = "access_token";
-    private final static String TYPE_PARAM = "client_type";
-    private final static String MANAGER = "manage";
-
     /**
      * 从token获取用户信息
      *
@@ -121,7 +115,7 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
 	private User getUserByToken(SSOToken token) {
 	    // 授权登录用户
 		User authorizedUser = null;
-		if (token.getData() != null) {
+		if (null != token && token.getData() != null) {
 			UserAccount tokenUser = FlexJsonUtils.fromJson(token.getData(), UserAccount.class);
 			if (!StringUtils.isEmpty(tokenUser.getUserUU())) {
 				// dialectUID表示client系统自己的唯一标识,比如user_uu,手机号没设置的情况下使用
@@ -163,23 +157,17 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
 	@Override
 	protected boolean onAuthenticateFailed(HttpServletRequest request, HttpServletResponse response) {
 		SystemSession.clear();
-        String typeParam = request.getParameter(TYPE_PARAM);
-        User user;
-        if (null != typeParam && MANAGER.equals(typeParam)) {
-            user = getUserByAccessToken(request);
-            if (user != null) {
-                user.setIp(AgentUtils.getIp(request));
-                request.getSession().setAttribute("user", user);
-                setGrantedAuthorities(user);
-                SystemSession.setUser(user);
-                return true;
-            }
-        } else {
-            user = verifyUserInfo(request);
-            if (null == user) {
-                user = autoLogin(request);
-            }
-        }
+		User user = (User) request.getSession().getAttribute("user");
+        if (user == null) {
+			user = getUserByAccessToken(request);
+			if (user != null) {
+				user.setIp(AgentUtils.getIp(request));
+				request.getSession().setAttribute("user", user);
+				setGrantedAuthorities(user);
+			} else {
+				user = autoLogin(request);
+			}
+		}
 		if (user != null) {
             checkIsPersonal(user);
             // 登录之前判断在当前企业的角色信息
@@ -301,82 +289,50 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
      */
 	@Override
 	protected void onAuthenticateSuccess(HttpServletRequest request, HttpServletResponse response) {
-	    // 设置管理平台访问优先级最高
-        String typeParam = request.getParameter(TYPE_PARAM);
-        User user;
-        if (null != typeParam && MANAGER.equals(typeParam)) {
-            user = getUserByAccessToken(request);
-            if (user != null) {
-                user.setIp(AgentUtils.getIp(request));
-                request.getSession().setAttribute("user", user);
-                setGrantedAuthorities(user);
-                SystemSession.setUser(user);
-            }
-        } else {
-            user = verifyUserInfo(request);
-            if (user != null) {
-                // 判断是否个人用户
-                checkIsPersonal(user);
-                // 登录之前判断在当前企业的角色信息
-                if (null != user.getEnterprise() && user.getEnterprise().getEnAdminuu().equals(user.getUserUU())) {
-                    Enterprise enterprise = user.getEnterprise();
-                    user = checkRoleAndReturnUserInfo(user, enterprise);
-                    user.setCurrentEnterprise(enterprise.getUu());
-                }
-                SystemSession.setUser(user);
-                setResponseAuthorized(response, user, true);
-                try {
-                    accessDecision(request, user);
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-            }
-        }
-	}
-
-    private User verifyUserInfo(HttpServletRequest request) {
-        User user = (User) request.getSession().getAttribute("user");
-        SSOToken token = SSOHelper.attrToken(request);
-        // cookie变化的情况下,session可能还未变化
+		User user = (User) request.getSession().getAttribute("user");
+		SSOToken token = SSOHelper.attrToken(request);
+		// cookie变化的情况下,session可能还未变化
         boolean onAuthenticateFailed = user == null || (user.getUserTel() != null && !token.getUid().equals(user.getUserTel()));
-        if (onAuthenticateFailed) {
-            user = getUserByToken(token);
-            if (user != null) {
-                user.setIp(AgentUtils.getIp(request));
-                request.getSession().setAttribute("user", user);
-                setGrantedAuthorities(user);
-                log(request, user);
-            }
-        } else {
-            // 从其他应用切换了企业的情况
-            if (token.getData() != null) {
-                UserAccount tokenUser = FlexJsonUtils.fromJson(token.getData(), UserAccount.class);
-                if (StringUtils.isEmpty(tokenUser.getSpaceUU()) && StringUtils.isEmpty(tokenUser.getBusinessCode())) {
-                    throw new AccessDeniedException("个人用户无法使用B2B商务平台");
-                }
-                Enterprise currentEnterprise = user.getEnterprise();
-                boolean changeSpace = false;
-                if (!StringUtils.isEmpty(tokenUser.getSpaceUU()) && !currentEnterprise.getUu().equals(tokenUser.getSpaceUU())) {
-                    user.setCurrentEnterprise(tokenUser.getSpaceUU());
-                    changeSpace = true;
-                } else if (StringUtils.isEmpty(tokenUser.getSpaceUU()) && !StringUtils.isEmpty(tokenUser.getBusinessCode())
-                    && !currentEnterprise.getEnBussinessCode().equals(tokenUser.getBusinessCode())) {
-                    List<Enterprise> enterpriseList = user.getEnterprises().stream()
-                        .filter(userSpace -> tokenUser.getBusinessCode().equals(userSpace.getEnBussinessCode()))
-                        .collect(Collectors.toList());
-                    if (CollectionUtil.isEmpty(enterpriseList)) {
-                        throw new AccessDeniedException(String.format("未找到关于%s的企业信息,请更换企业或账号", tokenUser.getBusinessCode()));
-                    }
-                    user.setCurrentEnterprise(enterpriseList.get(0));
-                    changeSpace = true;
-                }
-                if (changeSpace) {
-                    SystemSession.clear();
+		if (onAuthenticateFailed) {
+			user = getUserByToken(token);
+			if (user != null) {
+				user.setIp(AgentUtils.getIp(request));
+				request.getSession().setAttribute("user", user);
+				setGrantedAuthorities(user);
+				log(request, user);
+			}
+		} else {
+			// 从其他应用切换了企业的情况
+			if (token.getData() != null) {
+				UserAccount tokenUser = FlexJsonUtils.fromJson(token.getData(), UserAccount.class);
+				if (StringUtils.isEmpty(tokenUser.getBusinessCode()) || StringUtils.isEmpty(tokenUser.getSpaceUU())) {
+                    throw new IllegalAccessError("个人用户无法使用B2B商务平台");
                 }
+				// 如果是从个人用户切换或者当前企业切换
+				boolean flag = null == user.getEnterprise() || !user.getEnterprise().getUu().equals(tokenUser.getSpaceUU());
+				if (!StringUtils.isEmpty(tokenUser.getSpaceUU()) && flag) {
+					user.setCurrentEnterprise(tokenUser.getSpaceUU());
+				}
+			}
+		}
+		if (user != null) {
+		    // 判断是否个人用户
+            checkIsPersonal(user);
+            // 登录之前判断在当前企业的角色信息
+            if (null != user.getEnterprise() && user.getEnterprise().getEnAdminuu().equals(user.getUserUU())) {
+                Enterprise enterprise = user.getEnterprise();
+                user = checkRoleAndReturnUserInfo(user, enterprise);
+                user.setCurrentEnterprise(enterprise.getUu());
             }
-        }
-        return user;
-    }
+			SystemSession.setUser(user);
+            setResponseAuthorized(response, user, true);
+			try {
+				accessDecision(request, user);
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+	}
 
     /**
      * 检验是否个人用户
@@ -386,7 +342,7 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
     private void checkIsPersonal(User user) {
 	    boolean personalAccount = null == user.getEnterprise() || (null != user.getEnterprise() && null == user.getEnterprise().getUu());
 	    if (personalAccount) {
-            throw new AccessDeniedException("个人用户无法使用B2B商务平台");
+            throw new IllegalAccessError("个人用户无法使用B2B商务平台");
         }
     }
 
@@ -437,7 +393,7 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
 
 	/**
 	 * 加载资源,初始化资源变量
-	 * 
+	 *
 	 */
 	private void loadResourceDefine() {
 		if (resourceMap == null) {
@@ -501,44 +457,50 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
 		authorities.put(user.getUserUU(), authSet);
 	}
 
+	private final static String tokenParam = "access_token";
+	private final static String typeParam = "client_type";
+
 	/**
 	 * access_token验证登录
-	 * 
+	 *
 	 * @param request
 	 */
 	private User getUserByAccessToken(HttpServletRequest request) {
-		// 发现有采用access_token方式
-        // 清除上一次访问的数据
-        String token = request.getParameter(TOKEN_PARAM);
-        SystemSession.clear();
-        Object sUser = request.getSession().getAttribute("user");
-        User user = null;
-        if (sUser != null) {
-            // session里面原先存在user信息,接下来要判断此user是否与token绑定的user信息一致
-            // 一致则跳过,无需再次验证;不一致则替换
-            user = (User) sUser;
-        }
-        String type = request.getParameter(TYPE_PARAM);
-        if (MANAGER.equals(type)) {
-            if (user != null && UserCreater.isVirtual(user)) {
-                return user;
-            }
-            Map<String, Object> data = accessTokenService.validFormManage(token);
-            // user key
-            String userKey = "user";
-            // bind key
-            String bindKey = "bind";
-            if (data.containsKey(userKey) && data.containsKey(bindKey)) {
-                long enUU = Long.parseLong(data.get("bind").toString());
-                Enterprise enterprise = enterpriseService.findById(enUU);
-                if (enterprise != null) {
-                    List<Role> roles = roleService.findByEnterprise(enUU);
-                    // 虚拟用户
-                    user = UserCreater.createVirtual(String.valueOf(data.get("user")), enterprise, roles);
-                    return user;
-                }
-            }
-        }
+		String token = request.getParameter(tokenParam);
+        // 发现有采用access_token方式
+		if (token != null) {
+		    // 清除上一次访问的数据
+            SystemSession.clear();
+			Object sUser = request.getSession().getAttribute("user");
+			User user = null;
+			if (sUser != null) {
+				// session里面原先存在user信息,接下来要判断此user是否与token绑定的user信息一致
+				// 一致则跳过,无需再次验证;不一致则替换
+				user = (User) sUser;
+			}
+			String type = request.getParameter(typeParam);
+			String MANAGE_TYPE = "manage";
+			if (MANAGE_TYPE.equals(type)) {
+				if (user != null && UserCreater.isVirtual(user)) {
+					return user;
+				}
+				Map<String, Object> data = accessTokenService.validFormManage(token);
+				// user key
+				String USER_KEY = "user";
+				// bind key
+				String BIND_KEY = "bind";
+				if (data.containsKey(USER_KEY) && data.containsKey(BIND_KEY)) {
+					long enUU = Long.parseLong(data.get("bind").toString());
+					Enterprise enterprise = enterpriseService.findById(enUU);
+					if (enterprise != null) {
+						List<Role> roles = roleService.findByEnterprise(enUU);
+						// 虚拟用户
+						user = UserCreater.createVirtual(String.valueOf(data.get("user")), enterprise, roles);
+						return user;
+					}
+				}
+			}
+		}
 		return null;
 	}
 

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

@@ -251,6 +251,7 @@ public class ErpProdIODetail implements Serializable {
         this.ordercode = item.getOrderCode();
         this.thischeckqty = item.getCheckQty();
         this.pidate = item.getSourceDate();
+        this.qty = item.getCheckQty();
     }
 
     @Id

+ 82 - 0
src/main/java/com/uas/platform/b2b/model/PurcOrderInfoItem.java

@@ -262,6 +262,88 @@ public class PurcOrderInfoItem extends AbstractRedDotKey {
 	@Column(name = "pd_orispeccode")
 	private String oriSpecCode;
 
+	/**
+	 * 替代料号
+	 */
+	@Column(name = "pd_repprodcode")
+	private String repProdCode;
+
+	/**
+	 * 替代料名称
+	 */
+	@Column(name = "pd_repprodtitle")
+	private String repProdTitle;
+
+	/**
+	 * 替代料规格
+	 */
+	@Column(name = "pd_repprodspec")
+	private String repProdSpec;
+
+	/**
+	 * 旧料编号
+	 */
+	@Column(name = "pd_prodoldcode")
+	private String prodOldCode;
+	/**
+	 * 旧料名称
+	 */
+	@Column(name = "pd_prodoldtitle")
+	private String prodOldTitle;
+	/**
+	 * 旧料规格
+	 */
+	@Column(name = "pd_prodoldspec")
+	private String prodOldSpec;
+
+	public String getProdOldCode() {
+		return prodOldCode;
+	}
+
+	public void setProdOldCode(String prodOldCode) {
+		this.prodOldCode = prodOldCode;
+	}
+
+	public String getProdOldTitle() {
+		return prodOldTitle;
+	}
+
+	public void setProdOldTitle(String prodOldTitle) {
+		this.prodOldTitle = prodOldTitle;
+	}
+
+	public String getProdOldSpec() {
+		return prodOldSpec;
+	}
+
+	public void setProdOldSpec(String prodOldSpec) {
+		this.prodOldSpec = prodOldSpec;
+	}
+
+	public String getRepProdCode() {
+		return repProdCode;
+	}
+
+	public void setRepProdCode(String repProdCode) {
+		this.repProdCode = repProdCode;
+	}
+
+	public String getRepProdTitle() {
+		return repProdTitle;
+	}
+
+	public void setRepProdTitle(String repProdTitle) {
+		this.repProdTitle = repProdTitle;
+	}
+
+	public String getRepProdSpec() {
+		return repProdSpec;
+	}
+
+	public void setRepProdSpec(String repProdSpec) {
+		this.repProdSpec = repProdSpec;
+	}
+
 	public String getTaxCode() {
 		return taxCode;
 	}

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

@@ -265,6 +265,40 @@ public class PurchaseOrderAllItem extends AbstractRedDotKey {
 	@Column(name = "pd_orispeccode")
 	private String oriSpecCode;
 
+	/**
+	 * 替代料号
+	 */
+	@Column(name = "pd_repprodcode")
+	private String repProdCode;
+
+	/**
+	 * 替代料名称
+	 */
+	@Column(name = "pd_repprodtitle")
+	private String repProdTitle;
+
+	/**
+	 * 替代料规格
+	 */
+	@Column(name = "pd_repprodspec")
+	private String repProdSpec;
+
+	/**
+	 * 旧料编号
+	 */
+	@Column(name = "pd_prodoldcode")
+	private String prodOldCode;
+	/**
+	 * 旧料名称
+	 */
+	@Column(name = "pd_prodoldtitle")
+	private String prodOldTitle;
+	/**
+	 * 旧料规格
+	 */
+	@Column(name = "pd_prodoldspec")
+	private String prodOldSpec;
+
 	/**
 	 * 是否在变更中
 	 */
@@ -277,6 +311,54 @@ public class PurchaseOrderAllItem extends AbstractRedDotKey {
 	@Transient
 	private Double latestReplyQty;
 
+	public String getProdOldCode() {
+		return prodOldCode;
+	}
+
+	public void setProdOldCode(String prodOldCode) {
+		this.prodOldCode = prodOldCode;
+	}
+
+	public String getProdOldTitle() {
+		return prodOldTitle;
+	}
+
+	public void setProdOldTitle(String prodOldTitle) {
+		this.prodOldTitle = prodOldTitle;
+	}
+
+	public String getProdOldSpec() {
+		return prodOldSpec;
+	}
+
+	public void setProdOldSpec(String prodOldSpec) {
+		this.prodOldSpec = prodOldSpec;
+	}
+
+	public String getRepProdCode() {
+		return repProdCode;
+	}
+
+	public void setRepProdCode(String repProdCode) {
+		this.repProdCode = repProdCode;
+	}
+
+	public String getRepProdTitle() {
+		return repProdTitle;
+	}
+
+	public void setRepProdTitle(String repProdTitle) {
+		this.repProdTitle = repProdTitle;
+	}
+
+	public String getRepProdSpec() {
+		return repProdSpec;
+	}
+
+	public void setRepProdSpec(String repProdSpec) {
+		this.repProdSpec = repProdSpec;
+	}
+
 	public String getTaxCode() {
 		return taxCode;
 	}

+ 82 - 0
src/main/java/com/uas/platform/b2b/model/PurchaseOrderDoneItem.java

@@ -188,6 +188,40 @@ public class PurchaseOrderDoneItem extends AbstractOrderProduct {
 	 */
 	@Column(name = "pd_acceptcustaddress")
 	private  String acceptCustAddress;
+	/**
+	 * 替代料号
+	 */
+	@Column(name = "pd_repprodcode")
+	private String repProdCode;
+
+	/**
+	 * 替代料名称
+	 */
+	@Column(name = "pd_repprodtitle")
+	private String repProdTitle;
+
+	/**
+	 * 替代料规格
+	 */
+	@Column(name = "pd_repprodspec")
+	private String repProdSpec;
+
+	/**
+	 * 旧料编号
+	 */
+	@Column(name = "pd_prodoldcode")
+	private String prodOldCode;
+	/**
+	 * 旧料名称
+	 */
+	@Column(name = "pd_prodoldtitle")
+	private String prodOldTitle;
+	/**
+	 * 旧料规格
+	 */
+	@Column(name = "pd_prodoldspec")
+	private String prodOldSpec;
+
 
 	/**
 	 * 最后一次回复数量
@@ -195,6 +229,54 @@ public class PurchaseOrderDoneItem extends AbstractOrderProduct {
 	@Transient
 	private Double latestReplyQty;
 
+	public String getProdOldCode() {
+		return prodOldCode;
+	}
+
+	public void setProdOldCode(String prodOldCode) {
+		this.prodOldCode = prodOldCode;
+	}
+
+	public String getProdOldTitle() {
+		return prodOldTitle;
+	}
+
+	public void setProdOldTitle(String prodOldTitle) {
+		this.prodOldTitle = prodOldTitle;
+	}
+
+	public String getProdOldSpec() {
+		return prodOldSpec;
+	}
+
+	public void setProdOldSpec(String prodOldSpec) {
+		this.prodOldSpec = prodOldSpec;
+	}
+
+	public String getRepProdCode() {
+		return repProdCode;
+	}
+
+	public void setRepProdCode(String repProdCode) {
+		this.repProdCode = repProdCode;
+	}
+
+	public String getRepProdTitle() {
+		return repProdTitle;
+	}
+
+	public void setRepProdTitle(String repProdTitle) {
+		this.repProdTitle = repProdTitle;
+	}
+
+	public String getRepProdSpec() {
+		return repProdSpec;
+	}
+
+	public void setRepProdSpec(String repProdSpec) {
+		this.repProdSpec = repProdSpec;
+	}
+
 	public Long getId() {
 		return id;
 	}

+ 42 - 0
src/main/java/com/uas/platform/b2b/model/PurchaseOrderEnd.java

@@ -215,6 +215,48 @@ public class PurchaseOrderEnd {
 	@Column(name = "pu_custname")
 	private String custName; // 客户名称。
 
+	/**
+	 * 替代料号
+	 */
+	@Column(name = "pd_repprodcode")
+	private String repProdCode;
+
+	/**
+	 * 替代料名称
+	 */
+	@Column(name = "pd_repprodtitle")
+	private String repProdTitle;
+
+	/**
+	 * 替代料规格
+	 */
+	@Column(name = "pd_repprodspec")
+	private String repProdSpec;
+
+	public String getRepProdCode() {
+		return repProdCode;
+	}
+
+	public void setRepProdCode(String repProdCode) {
+		this.repProdCode = repProdCode;
+	}
+
+	public String getRepProdTitle() {
+		return repProdTitle;
+	}
+
+	public void setRepProdTitle(String repProdTitle) {
+		this.repProdTitle = repProdTitle;
+	}
+
+	public String getRepProdSpec() {
+		return repProdSpec;
+	}
+
+	public void setRepProdSpec(String repProdSpec) {
+		this.repProdSpec = repProdSpec;
+	}
+
 	public String getPurpose() {
 		return purpose;
 	}

+ 82 - 0
src/main/java/com/uas/platform/b2b/model/PurchaseOrderItem.java

@@ -210,6 +210,88 @@ public class PurchaseOrderItem extends AbstractRedDotKey {
 	@Column(name = "pd_acceptcustaddress")
 	private  String acceptCustAddress;
 
+	/**
+	 * 替代料号
+	 */
+	@Column(name = "pd_repprodcode")
+	private String repProdCode;
+
+	/**
+	 * 替代料名称
+	 */
+	@Column(name = "pd_repprodtitle")
+	private String repProdTitle;
+
+	/**
+	 * 替代料规格
+	 */
+	@Column(name = "pd_repprodspec")
+	private String repProdSpec;
+
+	/**
+	 * 旧料编号
+	 */
+	@Column(name = "pd_prodoldcode")
+	private String prodOldCode;
+	/**
+	 * 旧料名称
+	 */
+	@Column(name = "pd_prodoldtitle")
+	private String prodOldTitle;
+	/**
+	 * 旧料规格
+	 */
+	@Column(name = "pd_prodoldspec")
+	private String prodOldSpec;
+
+	public String getProdOldCode() {
+		return prodOldCode;
+	}
+
+	public void setProdOldCode(String prodOldCode) {
+		this.prodOldCode = prodOldCode;
+	}
+
+	public String getProdOldTitle() {
+		return prodOldTitle;
+	}
+
+	public void setProdOldTitle(String prodOldTitle) {
+		this.prodOldTitle = prodOldTitle;
+	}
+
+	public String getProdOldSpec() {
+		return prodOldSpec;
+	}
+
+	public void setProdOldSpec(String prodOldSpec) {
+		this.prodOldSpec = prodOldSpec;
+	}
+
+	public String getRepProdCode() {
+		return repProdCode;
+	}
+
+	public void setRepProdCode(String repProdCode) {
+		this.repProdCode = repProdCode;
+	}
+
+	public String getRepProdTitle() {
+		return repProdTitle;
+	}
+
+	public void setRepProdTitle(String repProdTitle) {
+		this.repProdTitle = repProdTitle;
+	}
+
+	public String getRepProdSpec() {
+		return repProdSpec;
+	}
+
+	public void setRepProdSpec(String repProdSpec) {
+		this.repProdSpec = repProdSpec;
+	}
+
 	public Long getId() {
 		return id;
 	}

+ 81 - 0
src/main/java/com/uas/platform/b2b/model/PurchaseOrderTodoItem.java

@@ -178,6 +178,39 @@ public class PurchaseOrderTodoItem extends AbstractOrderProduct {
 	 */
 	@Column(name = "pd_acceptcustaddress")
 	private  String acceptCustAddress;
+	/**
+	 * 替代料号
+	 */
+	@Column(name = "pd_repprodcode")
+	private String repProdCode;
+
+	/**
+	 * 替代料名称
+	 */
+	@Column(name = "pd_repprodtitle")
+	private String repProdTitle;
+
+	/**
+	 * 替代料规格
+	 */
+	@Column(name = "pd_repprodspec")
+	private String repProdSpec;
+
+	/**
+	 * 旧料编号
+	 */
+	@Column(name = "pd_prodoldcode")
+	private String prodOldCode;
+	/**
+	 * 旧料名称
+	 */
+	@Column(name = "pd_prodoldtitle")
+	private String prodOldTitle;
+	/**
+	 * 旧料规格
+	 */
+	@Column(name = "pd_prodoldspec")
+	private String prodOldSpec;
 
     /**
      * 最后一次回复数量
@@ -185,6 +218,54 @@ public class PurchaseOrderTodoItem extends AbstractOrderProduct {
 	@Transient
 	private Double latestReplyQty;
 
+	public String getProdOldCode() {
+		return prodOldCode;
+	}
+
+	public void setProdOldCode(String prodOldCode) {
+		this.prodOldCode = prodOldCode;
+	}
+
+	public String getProdOldTitle() {
+		return prodOldTitle;
+	}
+
+	public void setProdOldTitle(String prodOldTitle) {
+		this.prodOldTitle = prodOldTitle;
+	}
+
+	public String getProdOldSpec() {
+		return prodOldSpec;
+	}
+
+	public void setProdOldSpec(String prodOldSpec) {
+		this.prodOldSpec = prodOldSpec;
+	}
+
+	public String getRepProdCode() {
+		return repProdCode;
+	}
+
+	public void setRepProdCode(String repProdCode) {
+		this.repProdCode = repProdCode;
+	}
+
+	public String getRepProdTitle() {
+		return repProdTitle;
+	}
+
+	public void setRepProdTitle(String repProdTitle) {
+		this.repProdTitle = repProdTitle;
+	}
+
+	public String getRepProdSpec() {
+		return repProdSpec;
+	}
+
+	public void setRepProdSpec(String repProdSpec) {
+		this.repProdSpec = repProdSpec;
+	}
+
 	public String getPurcVendName() {
 		return purcVendName;
 	}

+ 81 - 0
src/main/java/com/uas/platform/b2b/model/PurchaseOrderWaitingItem.java

@@ -187,6 +187,39 @@ public class PurchaseOrderWaitingItem extends AbstractOrderProduct {
 	 */
 	@Column(name = "pd_acceptcustaddress")
 	private  String acceptCustAddress;
+	/**
+	 * 替代料号
+	 */
+	@Column(name = "pd_repprodcode")
+	private String repProdCode;
+
+	/**
+	 * 替代料名称
+	 */
+	@Column(name = "pd_repprodtitle")
+	private String repProdTitle;
+
+	/**
+	 * 替代料规格
+	 */
+	@Column(name = "pd_repprodspec")
+	private String repProdSpec;
+
+	/**
+	 * 旧料编号
+	 */
+	@Column(name = "pd_prodoldcode")
+	private String prodOldCode;
+	/**
+	 * 旧料名称
+	 */
+	@Column(name = "pd_prodoldtitle")
+	private String prodOldTitle;
+	/**
+	 * 旧料规格
+	 */
+	@Column(name = "pd_prodoldspec")
+	private String prodOldSpec;
 
 	/**
 	 * 关键词查询相关
@@ -200,6 +233,54 @@ public class PurchaseOrderWaitingItem extends AbstractOrderProduct {
 	@Transient
 	private Double latestReplyQty;
 
+	public String getProdOldCode() {
+		return prodOldCode;
+	}
+
+	public void setProdOldCode(String prodOldCode) {
+		this.prodOldCode = prodOldCode;
+	}
+
+	public String getProdOldTitle() {
+		return prodOldTitle;
+	}
+
+	public void setProdOldTitle(String prodOldTitle) {
+		this.prodOldTitle = prodOldTitle;
+	}
+
+	public String getProdOldSpec() {
+		return prodOldSpec;
+	}
+
+	public void setProdOldSpec(String prodOldSpec) {
+		this.prodOldSpec = prodOldSpec;
+	}
+
+	public String getRepProdCode() {
+		return repProdCode;
+	}
+
+	public void setRepProdCode(String repProdCode) {
+		this.repProdCode = repProdCode;
+	}
+
+	public String getRepProdTitle() {
+		return repProdTitle;
+	}
+
+	public void setRepProdTitle(String repProdTitle) {
+		this.repProdTitle = repProdTitle;
+	}
+
+	public String getRepProdSpec() {
+		return repProdSpec;
+	}
+
+	public void setRepProdSpec(String repProdSpec) {
+		this.repProdSpec = repProdSpec;
+	}
+
 	public Long getId() {
 		return id;
 	}

+ 10 - 4
src/main/java/com/uas/platform/b2b/model/User.java

@@ -3,6 +3,7 @@ package com.uas.platform.b2b.model;
 import com.alibaba.fastjson.annotation.JSONField;
 import com.uas.platform.b2b.support.CollectionUtil;
 import com.uas.platform.b2b.support.SystemSession;
+import com.uas.platform.b2b.support.UserCreater;
 import com.uas.platform.core.model.Constant;
 import com.uas.sso.entity.UserView;
 import org.codehaus.jackson.annotate.JsonIgnore;
@@ -27,6 +28,7 @@ import javax.persistence.OrderBy;
 import javax.persistence.Table;
 import javax.persistence.Transient;
 import java.io.*;
+import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -286,11 +288,15 @@ public class User implements Serializable {
 
 	public void setCurrentEnterprise(long enUU) {
 		if (this.enterprises != null && this.enterprises.size() > 0) {
-            List<Enterprise> correctEnterprises = enterprises.stream().filter(enter -> enter.getUu().equals(enUU)).collect(Collectors.toList());
-            if (CollectionUtil.isEmpty(correctEnterprises)) {
-                throw new AccessDeniedException(String.format("未找到关于%d的企业信息,请更换企业或账号", enUU));
+		    if (this.userUU == UserCreater.defaultUU) {
+                this.enterprise = new ArrayList<>(this.enterprises).get(0);
+            } else {
+                List<Enterprise> correctEnterprises = enterprises.stream().filter(enter -> enter.getUu().equals(enUU)).collect(Collectors.toList());
+                if (CollectionUtil.isEmpty(correctEnterprises)) {
+                    throw new AccessDeniedException(String.format("未找到关于%d的企业信息,请更换企业或账号", enUU));
+                }
+                this.enterprise = correctEnterprises.get(0);
             }
-            this.enterprise = correctEnterprises.get(0);
         }
 	}
 

+ 4 - 0
src/main/java/com/uas/platform/b2b/service/impl/ErpProdIODetailServiceImpl.java

@@ -148,6 +148,8 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
             setCheckAmount(erpProdIo, enUU, keyword.getCustomerUU(), checkDate, fromDate, endDate);
             // 查询已生成的对账单(需进行转换)
             List<PurchaseApCheckItemInfo> apCheckList = findApCheckList(enUU, keyword.getCustomerUU(), checkDate, fromDate, endDate, keyword);
+            apCheckList.removeIf(apCheck -> "已作废".equals(apCheck.getApCheck().getCheckStatus())
+                || "不同意".equals(apCheck.getApCheck().getCheckStatus()));
             List<ErpProdIODetail> detailList = covertApCheckToErpIo(apCheckList);
             erpProdIo.getDetails().addAll(detailList);
         }
@@ -223,6 +225,8 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
         if (null != keyword.getTaxRate()) {
             pageInfo.filter("taxrate", keyword.getTaxRate());
         }
+        pageInfo.expression(PredicateUtils.ne("apCheck.checkStatus", "不同意", true));
+        pageInfo.expression(PredicateUtils.ne("apCheck.checkStatus", "已作废", true));
         return apCheckItemInfoDao.findAll((Root<PurchaseApCheckItemInfo> root, CriteriaQuery<?> query, CriteriaBuilder builder) ->
             query.where(pageInfo.getPredicates(root, query, builder)).getRestriction());
     }

+ 12 - 6
src/main/java/com/uas/platform/b2b/support/UserCreater.java

@@ -9,16 +9,22 @@ import com.uas.platform.b2b.model.Role;
 import com.uas.platform.b2b.model.User;
 import com.uas.platform.core.model.Constant;
 
+/**
+ * 创建虚拟用户
+ *
+ * @author hejq
+ * @date 2018-12-28 19:38
+ */
 public class UserCreater {
 
-	private static final long defaultUU = -99999L;
+	public static final long defaultUU = -99999L;
 
 	/**
 	 * 创建虚拟用户
 	 * 
-	 * @param userName
-	 * @param ernterprise
-	 * @return
+	 * @param userName 用户姓名
+	 * @param enterprise 当前企业
+	 * @return 虚拟用户信息
 	 */
 	public static User createVirtual(String userName, Enterprise enterprise, List<Role> roles) {
 		User user = new User();
@@ -27,10 +33,10 @@ public class UserCreater {
 		user.setEnable(Constant.YES);
 		user.setIssys(Constant.YES);
 
-		Set<Enterprise> enterprises = new HashSet<Enterprise>();
+		Set<Enterprise> enterprises = new HashSet<>();
 		enterprises.add(enterprise);
 		user.setEnterprises(enterprises);
-		user.setCurrentEnterprise();
+		user.setEnterprise(enterprise);
 
 		user.setRoles(new HashSet<>(roles));
 

+ 18 - 22
src/main/java/com/uas/platform/b2b/v2/service/impl/EnterpriseServiceImpl.java

@@ -49,7 +49,7 @@ public class EnterpriseServiceImpl implements EnterpriseService {
 	@Autowired
     private InvitationRecordDao recordDao;
 
-	private final static CommBufferedLogger logger = BufferedLoggerManager.getLogger(CommBufferedLogger.class);
+	private final static CommBufferedLogger LOGGER = BufferedLoggerManager.getLogger(CommBufferedLogger.class);
 
 	private final static Logger INFO_LOG = Logger.getLogger(EnterpriseServiceImpl.class);
 
@@ -73,11 +73,7 @@ public class EnterpriseServiceImpl implements EnterpriseService {
 		enterprise.setEnArea(detail.getArea());
 		enterprise.setEnBussinessCode(detail.getBusinessCode());
 		enterprise.setEnCorporation(detail.getCorporation());
-		if(null != detail.getRegisterDate()) {
-			enterprise.setEnDate(new Date(detail.getRegisterDate()));
-		} else {
-			enterprise.setEnDate(new Date());
-		}
+        enterprise.setEnDate(null != detail.getRegisterDate() ? new Date(detail.getRegisterDate()) : new Date());
 		enterprise.setEnName(detail.getSpaceName());
 		enterprise.setLogUrl(detail.getLogoImage());
 		enterprise.setProfession(detail.getProfession());
@@ -94,26 +90,26 @@ public class EnterpriseServiceImpl implements EnterpriseService {
         User user = userDao.findOne(enterprise.getEnAdminuu());
         INFO_LOG.info("把管理员添加进企业: user-> " + JSONObject.toJSON(user));
         // 先进行管理员信息查找,如果不存在,等待用户信息先存储
-        synchronized (user) {
-            if (null == user) {
-                try {
-                    Thread.sleep(2000);
-                    user = userDao.findOne(enterprise.getEnAdminuu());
-                    if (null == user) {
-                        user = new User(detail.getAdmin());
-                    }
-                } catch (InterruptedException e) {
-                    e.printStackTrace();
+        if (null == user) {
+            try {
+                Thread.sleep(2000);
+                user = userDao.findOne(enterprise.getEnAdminuu());
+                if (null == user) {
+                    user = new User(detail.getAdmin());
                 }
+            } catch (InterruptedException e) {
+                e.printStackTrace();
             }
         }
-		user.addEnterprise(enterprise);
-		// 将用户设置为管理员,只对用户的当前企业的角色进行修改
+        if (user != null) {
+            user.addEnterprise(enterprise);
+        }
+        // 将用户设置为管理员,只对用户的当前企业的角色进行修改
         setUserRole(user, enterprise);
 		if (isNew) {
 			final Long enUU = enterprise.getUu();
             enterpriseDao.callInitProcedure(enUU);
-            logger.log("企业信息", "企业初始化", "新注册企业初始化资料", enUU);
+            LOGGER.log("企业信息", "企业初始化", "新注册企业初始化资料", enUU);
 		}
 		return enterprise;
 	}
@@ -137,7 +133,7 @@ public class EnterpriseServiceImpl implements EnterpriseService {
     @Override
     public User setUserRole(User user, Enterprise enterprise) {
         // 新用户注册企业时为空
-        Set<Role> existRoles = new HashSet<Role>();
+        Set<Role> existRoles = new HashSet<>();
         // 老用户注册新企业
         if (!CollectionUtils.isEmpty(user.getRoles())) {
             existRoles = user.getRoles();
@@ -209,7 +205,7 @@ public class EnterpriseServiceImpl implements EnterpriseService {
                 record.setVendusertel(enterpriseInfo.getEnTel());
                 record.setVendusername(enterpriseInfo.getContactMan());
                 User admin = userDao.findOne(enterpriseInfo.getEnAdminuu());
-                Date inviteDate = null != null ? new Date(enterpriseInfo.getInviteTime()) : new Date(System.currentTimeMillis());
+                Date inviteDate = new Date(System.currentTimeMillis());
                 record.setDate(inviteDate);
                 record.setVenduu(enterpriseInfo.getUu());
                 record.setSource(enterpriseInfo.getInviteSource() != null ? enterpriseInfo.getInviteSource() : "B2B");
@@ -223,7 +219,7 @@ public class EnterpriseServiceImpl implements EnterpriseService {
                 String inviteInfo = "企业名称: " + enterpriseInfo.getEnName() + ";"
                         + "邀请企业: " + inviteEnterprise.getEnName() + "(" + inviteEnterprise.getUu() + ");"
                         + "邀请人: " + inviteUser.getUserName() + "(" + inviteUser.getUserUU() + ")";
-                logger.log("添加合作伙伴", "企业注册添加合作伙伴", inviteInfo , enterpriseInfo.getUu());
+                LOGGER.log("添加合作伙伴", "企业注册添加合作伙伴", inviteInfo , enterpriseInfo.getUu());
             }
         }
     }

+ 3 - 3
src/main/java/com/uas/platform/b2b/v2/service/impl/UserServiceImpl.java

@@ -43,7 +43,7 @@ public class UserServiceImpl implements UserService {
 
 	private final static Logger LOGGER = Logger.getLogger(UserServiceImpl.class);
 	
-	static final String defaultPassword = "111111";
+	private static final String defaultPassword = "111111";
 
 	@Override
 	public User save(UserView user) {
@@ -116,9 +116,9 @@ public class UserServiceImpl implements UserService {
 		Enterprise enterprise = enterpriseDao.findOne(spaceUU);
 		if (user == null) {
 			user = new User(userView);
-			user.setEnterprises(new HashSet<Enterprise>());
+			user.setEnterprises(new HashSet<>());
 		}
-		if (user == null || enterprise == null) {
+		if (enterprise == null) {
 			return;
 		}
 		List<Role> roles = roleDao.findByEnUUAndDesc(enterprise.getUu(), "普通用户");

+ 42 - 10
src/main/webapp/resources/tpl/index/purc/order.html

@@ -160,7 +160,7 @@
 	top: -2px;
 }
 	.order-table .product div.text-over {
-		width: 340px;
+		width: 300px;
 		white-space: nowrap;
 		text-overflow: ellipsis;
 		overflow: hidden;
@@ -179,11 +179,14 @@
 .order-table .product div.text-overflow span{
 	float: left;
 	display: inline-block;
-	width: 340px;
+	width: 300px;
 	white-space: nowrap;
 	text-overflow: ellipsis;
 	overflow: hidden;
 }
+.auto-row {
+	width: 270px;word-wrap:break-word;
+}
 </style>
 <link rel="stylesheet" href="static/css/public.css">
 <div class="block" id="public">
@@ -305,18 +308,19 @@
 <table class="order-table block" ng-table="tableParams">
 	<thead>
 		<tr class="header">
-			<th>物料</th>
+			<th width="200">物料</th>
+			<th width="130"></th>
 			<th width="80">含税单价</th>
 			<th width="100">税率</th>
 			<th width="100">数量</th>
-			<th width="120">交货日期</th>
+			<th width="130">交货日期</th>
 			<th width="180">单据状态</th>
 			<th width="120">供应商</th>
 		</tr>
 	</thead>
 	<tbody ng-if="tableParams.total() == 0">
 	<tr>
-		<td colspan="7">
+		<td colspan="8">
 			<div id="empty">
 				<div class="left_img">
 					<a href="http://www.usoftchina.com/" target="_blank" title="优软云首页"><img src="static/img/empty/uas_empty.png"></a>
@@ -329,7 +333,7 @@
 		</td>
 	</tr>
 	<tr>
-		<td colspan="7">
+		<td colspan="8">
 			<div id="empty_info">
 				<div class="f16 text-center empty_title">
 					<p>为什么我没有采购订单?</p>
@@ -354,7 +358,7 @@
 	</tbody>
 	<tbody ng-repeat="order in $data track by order.id">
 		<tr class="order-hd" ng-dblclick="order.$collapsed=!order.$collapsed" ng-class="{'text-bold': order.display>0}">
-			<td class="first" colspan="5">
+			<td class="first" colspan="6">
 				<div class="order-main">
 					<a href="javascript:void(0)" ng-if="!isUnread(order.id)">
 						<i class="fa fa-circle-thin"></i>
@@ -401,9 +405,37 @@
 				<div class="text-muted text-over"
 					 title="{{::item.product.spec}}"
 					ng-bind="::item.product.spec"></div>
-				<div class="text-muted text-bold text-overflow" ng-if="item.vendspec" title="{{item.vendspec}}"><span ng-bind="::item.vendspec"></span></div>
-				<div class="text-bold text-inverse text-flow" ng-if="item.factory" title="{{item.factory}}"><b>送货工厂:</b><span ng-bind="::item.factory"></span></div>
-				<div class="text-bold text-inverse text-flow" ng-if="item.remark" title="{{item.remark}}"><b>备注:</b><span ng-bind="::item.remark"></span></div>
+				<div class="text-bold text-inverse text-flow" ng-if="item.prodOldCode" ><b>旧料编号:</b><div ng-bind="::item.prodOldCode"></div></div>
+				<div class="text-bold text-inverse text-flow" ng-if="item.prodOldTitle" ><b>旧料名称:</b><div ng-bind="::item.prodOldTitle"></div></div>
+				<div class="text-bold text-inverse text-flow" ng-if="item.prodOldSpec" ><b>旧料规格:</b><div ng-bind="::item.prodOldSpec"></div></div>
+				<div class="text-bold text-inverse text-flow" ng-if="item.vendspec" title="{{item.vendspec}}"><div ng-bind="::item.vendspec"></div></div>
+				<div class="text-bold text-inverse text-flow" ng-if="item.factory" title="{{item.factory}}"><b>送货工厂:</b><div ng-bind="::item.factory"></div></div>
+				<div class="text-bold text-inverse text-flow" ng-if="item.remark" title="{{item.remark}}"><b>备注:</b><div ng-bind="::item.remark"></d></div>
+			</td>
+			<td class="text-center">
+				<div ng-if="item.repProdCode" class="dropdown">
+					<a href="javascript:void(0);" class="dropdown-toggle text-default"
+					   ng-mouseover="getRepProd(item)">替代物料<i class="fa fa-fw fa-angle-down"></i></a>
+					<div class="dropdown-menu pane" style="width: 300px;">
+						<div class="pane-body">
+							<ul class="list-unstyled list-menu">
+								<li >
+									<div class="text-muted auto-row" ng-if="item.repProdCode != null">
+										<div class="text-bold text-inverse text-flow">替代料号:</div>{{::item.repProdCode}}
+									</div>
+								</li>
+								<li >
+									<div class="text-muted auto-row" ng-if="item.repProdTitle != null">
+										<div class="text-bold text-inverse text-flow">替代料名称:</div>{{::item.repProdTitle}}</div>
+								</li>
+								<li >
+									<div class="text-muted auto-row" ng-if="item.repProdSpec != null">
+										<div class="text-bold text-inverse text-flow">替代料规格:</div>{{::item.repProdSpec}}</div>
+								</li>
+							</ul>
+						</div>
+					</div>
+				</div>
 			</td>
 			<td class="text-center">
 				<div ng-if="!isUser" class="text-num" ng-bind="::item.price | number:6"></div>

+ 6 - 3
src/main/webapp/resources/tpl/index/purc/order_detail.html

@@ -132,9 +132,12 @@
 								<span ng-bind="::item.product.title"></span>
 							</div>
 							<div class="text-muted text-over" ng-bind="::item.product.spec" title="{{::item.product.spec}}"></div>
-							<div class="text-muted text-bold text-overflow" ng-if="item.vendspec" title="{{item.vendspec}}"><span ng-bind="::item.vendspec"></span></div>
-							<div class="text-bold text-inverse text-flow" ng-if="item.factory" title="{{item.factory}}"><b>送货工厂:</b><span ng-bind="::item.factory"></span></div>
-							<div class="text-bold text-inverse text-flow" ng-if="item.remark" title="{{item.remark}}"><b>备注:</b><span ng-bind="::item.remark"></span></div>
+							<div class="text-bold text-inverse text-flow" ng-if="item.prodOldCode" ><b>旧料编号:</b><div ng-bind="::item.prodOldCode"></div></div>
+							<div class="text-bold text-inverse text-flow" ng-if="item.prodOldTitle" ><b>旧料名称:</b><div ng-bind="::item.prodOldTitle"></div></div>
+							<div class="text-bold text-inverse text-flow" ng-if="item.prodOldSpec" ><b>旧料规格:</b><div ng-bind="::item.prodOldSpec"></div></div>
+							<div class="text-bold text-inverse text-flow" ng-if="item.vendspec" title="{{item.vendspec}}"><div ng-bind="::item.vendspec"></div></div>
+							<div class="text-bold text-inverse text-flow" ng-if="item.factory" title="{{item.factory}}"><b>送货工厂:</b><div ng-bind="::item.factory"></div></div>
+							<div class="text-bold text-inverse text-flow" ng-if="item.remark" title="{{item.remark}}"><b>备注:</b><div ng-bind="::item.remark"></div></div>
 						</td>
 						<td class="text-center" width="110">
 							<div ng-if="!isUser" class="text-num" ng-bind="::item.price | number:6"></div>

+ 10 - 10
src/main/webapp/resources/tpl/index/sale/accept.html

@@ -219,23 +219,23 @@
 			<tr class="order-bd" ng-repeat="item in accept.acceptItems">
 				<td class="product">
 					<div class="text-num text-bold">
-						<span ng-bind="item.orderItem.product.code"
-							ng-if="item.orderItem.product.code != null"></span> <span
-							ng-bind="item.product.code"
-							ng-if="item.orderItem.product.code == null"></span>
+						<span ng-bind="item.product.code"
+							  ng-if="item.product.code != null"></span> <span
+							ng-bind="item.orderItem.product.code"
+							ng-if="item.product.code == null"></span>
 					</div>
 					<div>
 						<span ng-bind="item.orderItem.product.title"
-							ng-if="item.orderItem.product.title != null"></span> <span
+							  ng-if="item.product.title == null"></span> <span
 							ng-bind="item.product.title"
-							ng-if="item.orderItem.product.title == null"></span>
+							ng-if="item.product.title != null"></span>
 					</div>
-					<div class="text-muted" title="{{item.orderItem.product.spec}}"
-						ng-bind="item.orderItem.product.spec"
-						ng-if="item.orderItem.product.spec != null"></div>
 					<div class="text-muted" title="{{item.product.spec}}"
 						ng-bind="item.product.spec"
-						ng-if="item.orderItem.product.spec == null"></div>
+						ng-if="item.product.spec != null"></div>
+					<div class="text-muted" title="{{item.orderItem.product.spec}}"
+						ng-bind="item.orderItem.product.spec"
+						ng-if="item.product.spec == null"></div>
 					<div class="text-bold text-inverse" title="送货工厂"
 						ng-if="item.orderItem.factory">
 						送货工厂:<span ng-bind="::item.orderItem.factory"></span>

+ 39 - 3
src/main/webapp/resources/tpl/index/sale/notice.html

@@ -7,6 +7,10 @@
         border-bottom: 1px solid #e8e8e8;
     }
 
+    .auto-row {
+        width: 270px;word-wrap:break-word;
+    }
+
     .order-table .sep-row {
         height: 10px;
     }
@@ -295,6 +299,7 @@
         <thead>
         <tr class="header">
             <th width="200">产品</th>
+            <th width="120"></th>
             <th width="150">备注</th>
             <th width="200">数量</th>
             <th width="140">价格</th>
@@ -302,7 +307,7 @@
             <th width="100">操作</th>
         </tr>
         <tr class="sep-row">
-            <td colspan="6"></td>
+            <td colspan="7"></td>
         </tr>
         <tr class="toolbar toolbar-top">
             <td colspan="5">
@@ -322,12 +327,12 @@
             </td>
         </tr>
         <tr class="sep-row">
-            <td colspan="6"></td>
+            <td colspan="7"></td>
         </tr>
         </thead>
         <tbody ng-repeat="notice in $data track by notice.id">
         <tr class="order-hd">
-            <td class="first" colspan="3">
+            <td class="first" colspan="4">
                 <div class="order-main">
 					<span> <input type="checkbox" ng-disabled="notice.waiting" class="selector"
                               ng-model="notice.$selected" ng-click="checkOne(notice)">
@@ -383,6 +388,12 @@
                 </div>
                 <div class="text-muted text-ellipsis"
                      ng-bind="::notice.orderItem.product.spec"></div>
+                <div class="text-bold text-inverse" ng-if="notice.orderItem.prodOldCode">旧料编号:<span
+                        ng-bind="::notice.orderItem.prodOldCode"></span></div>
+                <div class="text-bold text-inverse" ng-if="notice.orderItem.prodOldTitle">旧料名称:<span
+                        ng-bind="::notice.orderItem.prodOldTitle"></span></div>
+                <div class="text-bold text-inverse" ng-if="notice.orderItem.prodOldSpec">旧料规格:<span
+                        ng-bind="::notice.orderItem.prodOldSpec"></span></div>
                 <div class="text-bold text-inverse" ng-if="notice.orderItem.factory">送货工厂:<span
                         ng-bind="::notice.orderItem.factory"></span></div>
                 <div class="text-bold text-inverse" ng-if="notice.orderItem.custPurchaseCode">客户采购单号:<span
@@ -390,6 +401,31 @@
                 <div class="text-bold text-inverse" ng-if="notice.orderItem.acceptCustName">收货客户:<span
                         ng-bind="::notice.orderItem.acceptCustName"></span></div>
             </td>
+            <td class="text-center">
+                <div ng-if="notice.orderItem.repProdCode" class="dropdown">
+                    <a href="javascript:void(0);" class="dropdown-toggle text-default"
+                       ng-mouseover="getRepProd(notice.orderItem)">替代物料<i class="fa fa-fw fa-angle-down"></i></a>
+                    <div class="dropdown-menu pane" style="width: 300px;">
+                        <div class="pane-body">
+                            <ul class="list-unstyled list-menu">
+                                <li >
+                                    <div class="text-muted auto-row" ng-if="notice.orderItem.repProdCode != null">
+                                        <div class="text-bold text-inverse text-flow">替代料号:</div>{{::notice.orderItem.repProdCode}}
+                                    </div>
+                                </li>
+                                <li >
+                                    <div class="text-muted auto-row" ng-if="notice.orderItem.repProdTitle != null">
+                                        <div class="text-bold text-inverse text-flow">替代料名称:</div>{{::notice.orderItem.repProdTitle}}</div>
+                                </li>
+                                <li >
+                                    <div class="text-muted auto-row" ng-if="notice.orderItem.repProdSpec != null">
+                                        <div class="text-bold text-inverse text-flow">替代料规格:</div>{{::notice.orderItem.repProdSpec}}</div>
+                                </li>
+                            </ul>
+                        </div>
+                    </div>
+                </div>
+            </td>
             <td class="text-center">
                 <div ng-show="!notice.$editing">{{notice.remark}}</div>
                 <div ng-if="notice.$editing">

+ 42 - 80
src/main/webapp/resources/tpl/index/sale/order.html

@@ -4,7 +4,9 @@
 	height: 36px;
 	opacity: 1;
 }
-
+.auto-row {
+	width: 270px;word-wrap:break-word;
+}
 .condition .more .form-group {
 	/*margin-bottom: 10px;*/
 }
@@ -215,56 +217,6 @@
 					</div>
 				</div>
 			</div>
-			<!--<div class="col-xs-5">
-				<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()" placeholder="输入商品、客户名称或单据流水号搜索" />
-						<div class="search-advance text-link" ng-class="{'active': searchAdvance}" dropdown-toggle>高级搜索</div>
-						<div id="searchContainer" class="dropdown-menu">
-							&lt;!&ndash; <div class="block">
-								<form action="" class="form-horizontal">
-									<div class="form-group">
-										<label for="" class="col-xs-3 text-right control-label">关键词:</label>
-										<div class="col-xs-6"><input type="text" class="form-control" /></div>
-									</div>
-									<div class="form-group">
-										<label for="" class="col-xs-3 text-right control-label">交货日期:</label>
-										<div class="col-xs-6"><input type="text" class="form-control" /></div>
-									</div>
-									<div class="form-group">
-										<label for="orderDate" class="col-xs-3 text-right control-label">订单日期:</label>
-										<div class="col-xs-6"><input id="orderDate" type="text" class="form-control" /></div>
-									</div>
-									<div class="form-group">
-										<label for="" class="col-xs-3 text-right control-label">单价:</label>
-										<div class="col-xs-6"><input type="text" class="form-control" /></div>
-									</div>
-									<div class="form-group">
-										<label for="" class="col-xs-3 text-right control-label">
-											金额:
-										</label>
-										<div class="col-xs-6"><input type="text" class="form-control" /></div>
-									</div>
-									<div class="form-group">
-										<div for="" class="col-xs-12 text-right">
-											<button class="btn btn-info btn-xs">确定</button>
-										</div>
-									</div>
-								</form>
-							</div> &ndash;&gt;
-						</div>
-						<span class="form-control-feedback text-simple"><i class="fa fa-search"></i></span>
-					</div>
-				</div>
-			</div>
-			<div class="col-xs-1">
-				<div class="text-default f14 total">
-					共 <span ng-bind="tableParams.total()" class="text-num"></span>
-				</div>
-			</div>
-			<div class="col-xs-2 toggle">
-				<a ng-click="condition.$open=!condition.$open" class="text-simple"><span ng-bind="condition.$open ? '简化筛选条件' : '更多筛选条件'"></span><i class="fa fa-fw" ng-class="{'fa-angle-up': condition.$open, 'fa-angle-down': !condition.$open}"></i></a>
-			</div>-->
 		</div>
 	</div>
 <!--<div class="height10">&nbsp;</div>-->
@@ -337,7 +289,8 @@
 <table class="order-table block" ng-table="tableParams">
 	<thead>
 		<tr class="header">
-			<th width="400">产品</th>
+			<th width="300">产品</th>
+			<th width="120"></th>
 			<th width="100">单价</th>
 			<th width="100">数量</th>
 			<th width="120">交货日期</th>
@@ -345,7 +298,7 @@
 			<th width="100">操作</th>
 		</tr>
 		<tr class="sep-row">
-			<td colspan="6"></td>
+			<td colspan="7"></td>
 		</tr>
 		<tr class="toolbar toolbar-top">
 			<td colspan="5">
@@ -353,16 +306,6 @@
 					<label><input type="checkbox" class="selector select_all"
 						ng-model="checkboxes.checked" ng-click="checkAll()">全选</label> <a ng-if="active=='todo'" href="javascript:void(0)"
 						class="btn btn-default btn-xs" ng-click="replyByBatch();setOrdersReadByBatch()" title="选中的单据按照客户需求的数量和交期默认回复">&nbsp;批量回复&nbsp;</a>
-						<!--<div class="btn-group dropdown">
-  							<button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown" aria-expanded="true">
-    							&nbsp;&nbsp;标记为&nbsp;&nbsp;<span class="caret"></span>&nbsp;
-  							</button>
-  							<ul class="dropdown-menu" role="menu">
-    							<li><a href="javascript:void(0)" ng-click="setDisplay('setRead')">已查看</a></li>
-    							<li><a href="javascript:void(0)" ng-click="setDisplay('setUnRead')">未查看</a></li>
-    							<li><a href="javascript:void(0)" ng-click="setDisplay('setTop')">置顶</a></li>
-  							</ul>
-						</div>-->
 						<span class="text-muted">
 							&nbsp;&nbsp;<i class="fa fa-exclamation-triangle"></i> 批量回复是对选中的单据按照满足客户需求的数量和交期默认回复。
 						</span>
@@ -373,12 +316,12 @@
 			</td>
 		</tr>
 		<tr class="sep-row">
-			<td colspan="6"></td>
+			<td colspan="7"></td>
 		</tr>
 	</thead>
 	<tbody ng-if="tableParams.total() == 0">
 	<tr>
-		<td colspan="6">
+		<td colspan="7">
 			<div id="empty">
 				<div class="left_img">
 					<a href="http://www.usoftchina.com/" target="_blank" title="优软云首页"><img src="static/img/empty/uas_empty.png"></a>
@@ -391,7 +334,7 @@
 		</td>
 	</tr>
 		<tr>
-			<td colspan="6">
+			<td colspan="7">
 				<div id="empty_info">
 					<div class="f16 text-center empty_title">
 						<p>为什么我没有接收到客户的采购订单?</p>
@@ -436,11 +379,11 @@
 					<span>订单号:<a class="text-num order-detail" ng-bind="::order.code" ui-sref="sale.order_detail({id:order.id})" target="_self" title="查看详情" ng-click="setOrdersRead(order.id)"></a></span>
 				</div>
 			</td>
-			<td ng-if="!isUser" colspan="1" class="order-sum">{{::order.currency}}: <span
+			<td ng-if="!isUser" colspan="2" class="order-sum">{{::order.currency}}: <span
 				ng-bind="getOrderTotal(order.orderItems) | number : 2"
 				class="text-num text-bold"></span>
 			</td>
-			<td ng-if="isUser" colspan="1" class="order-sum"></td>
+			<td ng-if="isUser" colspan="2" class="order-sum"></td>
 			<td colspan="1" class="text-center">
 				<span ng-if="order.print" class="label ng-scope operates-status" style="margin-right: 5px;background-color: #5D6C79">已打印</span>
 				<span ng-if="!order.print" class="label ng-scope operates-status" style="margin-right: 5px;background-color: #CA3955">未打印</span>
@@ -465,12 +408,40 @@
 				<div class="text-muted text-over"
 					 title="{{::item.product.spec}}"
 					ng-bind="::item.product.spec"></div>
+				<div class="text-bold text-inverse text-flow" ng-if="item.prodOldCode" ><b>旧料编号:</b><div ng-bind="::item.prodOldCode"></div></div>
+				<div class="text-bold text-inverse text-flow" ng-if="item.prodOldTitle" ><b>旧料名称:</b><div ng-bind="::item.prodOldTitle"></div></div>
+				<div class="text-bold text-inverse text-flow" ng-if="item.prodOldSpec" ><b>旧料规格:</b><div ng-bind="::item.prodOldSpec"></div></div>
 				<div class="text-bold text-inverse text-flow" ng-if="item.custPurchaseCode" ><b>客户采购单号:</b><div ng-bind="::item.custPurchaseCode"></div></div>
 				<div class="text-bold text-inverse text-flow" ng-if="item.acceptCustName" ><b>收货客户:</b><div ng-bind="::item.acceptCustName"></div></div>
 				<div class="text-bold text-inverse text-flow" ng-if="item.acceptCustAddress" ><b>客户收货地址:</b><div ng-bind="::item.acceptCustAddress"></div></div>
-				<div class="text-muted text-bold text-overflow" ng-if="item.vendspec" title="{{item.vendspec}}"><span ng-bind="::item.vendspec"></span></div>
-				<div class="text-bold text-inverse text-flow" ng-if="item.factory" title="{{item.factory}}"><b>送货工厂:</b><span ng-bind="::item.factory"></span></div>
-				<div class="text-bold text-inverse text-flow" ng-if="item.remark" title="{{item.remark}}"><b>备注:</b><span ng-bind="::item.remark"></span></div>
+				<div class="text-bold text-inverse text-flow" ng-if="item.vendspec" title="{{item.vendspec}}"><div ng-bind="::item.vendspec"></div></div>
+				<div class="text-bold text-inverse text-flow" ng-if="item.factory" title="{{item.factory}}"><b>送货工厂:</b><div ng-bind="::item.factory"></div></div>
+				<div class="text-bold text-inverse text-flow" ng-if="item.remark" title="{{item.remark}}"><b>备注:</b><div ng-bind="::item.remark"></div></div>
+			</td>
+			<td class="text-center">
+				<div ng-if="item.repProdCode" class="dropdown" ng-class="text-center">
+					<a href="javascript:void(0);" class="dropdown-toggle text-default"
+					   ng-mouseover="getRepProd(item)">替代物料<i class="fa fa-fw fa-angle-down"></i></a>
+					<div class="dropdown-menu pane" style="width: 300px;">
+						<div class="pane-body">
+							<ul class="list-unstyled list-menu">
+								<li >
+									<div class="text-muted auto-row" ng-if="item.repProdCode != null" >
+										<div class="text-bold text-inverse text-flow">替代料号:</div>{{::item.repProdCode}}
+									</div>
+								</li>
+								<li >
+									<div class="text-muted auto-row" ng-if="item.repProdTitle != null" >
+										<div class="text-bold text-inverse text-flow">替代料名称:</div>{{::item.repProdTitle}}</div>
+								</li>
+								<li >
+									<div class="text-muted auto-row" ng-if="item.repProdSpec != null">
+										<div class="text-bold text-inverse text-flow">替代料规格:</div>{{::item.repProdSpec}}</div>
+								</li>
+							</ul>
+						</div>
+					</div>
+				</div>
 			</td>
 			<td class="text-center">
 				<div ng-if="!isUser" class="text-num" ng-bind="::item.price | number:6"></div>
@@ -510,15 +481,6 @@
 				<div ng-if="!item.$editing">
 					<div ng-if="!item.replyQty" class="text-muted text-center">未回复</div>
 					<div ng-if="item.replyQty > 0 && item.replyQty < item.qty">
-						<!--<div class="progress progress-sm">
-							<div class="progress-bar progress-bar-success"
-								ng-style="{'width': 100*item.replyQty/item.qty + '%'}">
-								<span class="sr-only"></span>
-							</div>
-						</div>
-						已回复 <span class="text-default">{{::item.replyQty}}</span> /
-						<span>{{::item.qty}}</span>-->
-
 						已回复 <span class="text-default">{{::item.latestReplyQty}}</span>
 
 					</div>

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

@@ -122,7 +122,7 @@
 				<thead>
 					<tr class="header">
 						<th width="50">序号</th>
-						<th width="200">产品</th>
+						<th width="270">产品</th>
 						<th width="80">单价</th>
 						<th width="80">税率</th>
 						<th width="110">数量</th>
@@ -139,19 +139,22 @@
 						<td class="text-center text-num" width="50">
 							<span ng-bind="::item.number"></span>
 						</td>
-						<td width="200">
+						<td width="270" class="product">
 							<div class="text-num text-overflow" title="{{::item.product.code}}">
 								<span ng-bind="::item.product.code"></span>
 							</div>
 							<div class="text-overflow" title="{{::item.product.title}}">
-								<span ng-bind="::item.product.title"></span>
+								<span ng-bind="::item.product.title"></span> </div>
 							<div class="text-muted text-over" ng-bind="::item.product.spec" title="{{::item.product.spec}}"></div>
-							<div class="text-muted text-bold text-overflow" ng-if="item.vendspec" title="item.vendspec"><span ng-bind="::item.vendspec"></span></div>
+							<div class="text-bole text-inverse text-flow" ng-if="item.prodOldCode" ><b>旧料编号:</b><span ng-bind="::item.prodOldCode"></span></div>
+							<div class="text-bold text-inverse text-flow" ng-if="item.prodOldTitle" ><b>旧料名称:</b><span ng-bind="::item.prodOldTitle"></span></div>
+							<div class="text-bold text-inverse text-flow" ng-if="item.prodOldSpec" ><b>旧料规格:</b><span ng-bind="::item.prodOldSpec"></span></div>
+							<div class="text-bold text-inverse text-flow" ng-if="item.vendspec" title="item.vendspec"><span ng-bind="::item.vendspec"></span></div>
 							<div class="text-bold text-inverse text-flow" ng-if="item.factory" title="{{item.factory}}"><b>送货工厂:</b><span ng-bind="::item.factory"></span></div>
-							<div class="text-bold text-inverse text-flow" ng-if="item.custPurchaseCode"><b>客户采购单号:</b><br><span ng-bind="::item.custPurchaseCode"></span></div>
-							<div class="text-bold text-inverse text-flow" ng-if="item.acceptCustName"><b>收货客户:</b><br>
+							<div class="text-bold text-inverse text-flow" ng-if="item.custPurchaseCode"><b>客户采购单号:</b><span ng-bind="::item.custPurchaseCode"></span></div>
+							<div class="text-bold text-inverse text-flow" ng-if="item.acceptCustName"><b>收货客户:</b>
 								<span ng-bind="::item.acceptCustName"></span></div>
-							<div class="text-bold text-inverse text-flow" ng-if="item.acceptCustAddress"><b>客户收货地址:</b><br>
+							<div class="text-bold text-inverse text-flow" ng-if="item.acceptCustAddress"><b>客户收货地址:</b>
 								<span ng-bind="::item.acceptCustAddress"></span></div>
 							<div class="text-bold text-inverse text-flow" ng-if="item.remark" title="{{item.remark}}"><b>备注:</b><span ng-bind="::item.remark"></span></div>
 							<div ng-repeat="att in item.attachs" class="text-bold text-bold text-overflow">

+ 33 - 0
src/test/java/com/uas/platform/b2b/purc/PurchaseNotify.java

@@ -1,6 +1,8 @@
 package com.uas.platform.b2b.purc;
 
 import com.uas.platform.b2b.BaseJunitTest;
+import com.uas.platform.b2b.core.util.DateFormatUtils;
+import com.uas.platform.b2b.dao.CommonDao;
 import com.uas.platform.b2b.dao.PurchaseNoticeDao;
 import com.uas.platform.b2b.dao.PurchaseOrderItemDao;
 import com.uas.platform.b2b.model.PurchaseNotice;
@@ -29,6 +31,9 @@ public class PurchaseNotify extends BaseJunitTest {
     @Autowired
     private EntityManagerFactory entityManagerFactory;
 
+    @Autowired
+    private CommonDao commonDao;
+
     @PersistenceContext
     protected EntityManager em;
 
@@ -126,4 +131,32 @@ public class PurchaseNotify extends BaseJunitTest {
         return notice;
     }
 
+
+    /**
+     * // 测试用例
+     // -1, 不跨年,25日前
+     sendDate(-1, '2018-12-23')  期望结果: '2018-11-26'
+     // -1,不跨年,26日后
+     sendDate(-1, '2018-12-28')  期望结果: '2018-11-26'
+     // -1, 跨年,25日前
+     sendDate(-1, '2019-01-23')  期望结果: '2018-12-26'
+     // -1,跨年,26日后
+     sendDate(-1, '2019-01-28')  期望结果: '2018-12-26'
+     // >=0, 不跨年,不跨月
+     sendDate(5, '2018-12-23')  期望结果: '2018-12-17'
+     // >=0,不跨年,跨月,有31号
+     sendDate(5, '2018-12-02')  期望结果: '2018-11-26'
+     // >=0,不跨年,跨月,无31号
+     sendDate(5, '2018-11-02')  期望结果: '2018-10-27'
+     // >=0, 跨年,不跨月
+     sendDate(5, '2019-01-23')  期望结果: '2019-01-17'
+     // >=0,跨年,跨月
+     sendDate(5, '2019-01-02')  期望结果: '2018-12-27'
+     */
+    @Test
+    public void getSendDelivery() {
+        StringBuffer sql = new StringBuffer("select purc_notice_delivery('").append("2018-12-23").append("', ").append("-1").append(")");
+        Date delivery = commonDao.queryForObject(sql.toString(), Date.class);
+        System.out.println(delivery);
+    }
 }