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

Merge branch 'dev-mysql' into liusw-account-v1.0.10.19

# Conflicts:
#	src/main/java/com/uas/platform/b2c/common/account/v2/service/impl/UserServiceImpl.java
#	src/main/webapp/WEB-INF/views/normal/user_center.html
#	src/main/webapp/resources/css/common.css
#	src/main/webapp/resources/js/usercenter/controllers/forstore/account_manager_ctrl.js
#	src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_home_ctrl.js
#	src/main/webapp/resources/js/vendor/controllers/forstore/vendor_account_management_ctrl.js
#	src/main/webapp/resources/view/usercenter/forstore/account_manager.html
#	src/main/webapp/resources/view/usercenter/forstore/buyer_transfer.html
#	src/main/webapp/resources/view/vendor/forstore/vendor_account_management.html
529010777@qq.com пре 8 година
родитељ
комит
5e9cf26e9a
100 измењених фајлова са 5835 додато и 772 уклоњено
  1. 13 11
      src/main/java/com/uas/platform/b2c/common/account/controller/SecurityController.java
  2. 55 5
      src/main/java/com/uas/platform/b2c/common/account/model/UsageLog.java
  3. 21 2
      src/main/java/com/uas/platform/b2c/common/account/v2/service/impl/EnterpriseServiceImpl.java
  4. 47 40
      src/main/java/com/uas/platform/b2c/common/account/v2/service/impl/UserServiceImpl.java
  5. 10 0
      src/main/java/com/uas/platform/b2c/common/base/service/SendMessageService.java
  6. 11 1
      src/main/java/com/uas/platform/b2c/common/base/service/impl/SendMessageServiceImpl.java
  7. 11 1
      src/main/java/com/uas/platform/b2c/core/config/MicroServicesConf.java
  8. 16 0
      src/main/java/com/uas/platform/b2c/core/constant/Status.java
  9. 10 0
      src/main/java/com/uas/platform/b2c/core/constant/Type.java
  10. 14 3
      src/main/java/com/uas/platform/b2c/core/filter/KeyWordFilter.java
  11. 39 0
      src/main/java/com/uas/platform/b2c/core/support/EncryptablePropertyPlaceholderConfigurer.java
  12. 25 5
      src/main/java/com/uas/platform/b2c/core/support/log/UsageBufferedLogger.java
  13. 1 1
      src/main/java/com/uas/platform/b2c/external/erp/order/api/PurchaseController.java
  14. 32 20
      src/main/java/com/uas/platform/b2c/fa/payment/controller/BankInfoController.java
  15. 46 2
      src/main/java/com/uas/platform/b2c/fa/payment/controller/BankTransferController.java
  16. 71 0
      src/main/java/com/uas/platform/b2c/fa/payment/controller/InstallmentController.java
  17. 71 0
      src/main/java/com/uas/platform/b2c/fa/payment/controller/InstallmentStoreController.java
  18. 75 41
      src/main/java/com/uas/platform/b2c/fa/payment/dao/BankInfoDao.java
  19. 29 0
      src/main/java/com/uas/platform/b2c/fa/payment/dao/InstallmentDao.java
  20. 36 0
      src/main/java/com/uas/platform/b2c/fa/payment/dao/InstallmentDetailDao.java
  21. 32 0
      src/main/java/com/uas/platform/b2c/fa/payment/dao/InstallmentStoreDao.java
  22. 18 18
      src/main/java/com/uas/platform/b2c/fa/payment/model/BankInfo.java
  23. 106 1
      src/main/java/com/uas/platform/b2c/fa/payment/model/BankTransfer.java
  24. 156 0
      src/main/java/com/uas/platform/b2c/fa/payment/model/Installment.java
  25. 175 0
      src/main/java/com/uas/platform/b2c/fa/payment/model/InstallmentDetail.java
  26. 116 0
      src/main/java/com/uas/platform/b2c/fa/payment/model/InstallmentStore.java
  27. 21 4
      src/main/java/com/uas/platform/b2c/fa/payment/service/BankInfoService.java
  28. 12 1
      src/main/java/com/uas/platform/b2c/fa/payment/service/BankTransferService.java
  29. 57 0
      src/main/java/com/uas/platform/b2c/fa/payment/service/InstallmentService.java
  30. 46 0
      src/main/java/com/uas/platform/b2c/fa/payment/service/InstallmentStoreService.java
  31. 138 68
      src/main/java/com/uas/platform/b2c/fa/payment/service/impl/BankInfoServiceImpl.java
  32. 166 29
      src/main/java/com/uas/platform/b2c/fa/payment/service/impl/BankTransferServiceImpl.java
  33. 365 0
      src/main/java/com/uas/platform/b2c/fa/payment/service/impl/InstallmentServiceImpl.java
  34. 98 0
      src/main/java/com/uas/platform/b2c/fa/payment/service/impl/InstallmentStoreServiceImpl.java
  35. 7 1
      src/main/java/com/uas/platform/b2c/fa/settlement/service/impl/SettlementServiceImpl.java
  36. 15 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/Goods.java
  37. 10 3
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ReleaseProductByBatchServiceImpl.java
  38. 28 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/modal/Brand.java
  39. 2 2
      src/main/java/com/uas/platform/b2c/prod/product/component/dao/ComponentCrawlDao.java
  40. 28 0
      src/main/java/com/uas/platform/b2c/prod/product/component/modal/Component.java
  41. 28 0
      src/main/java/com/uas/platform/b2c/prod/product/kind/model/Kind.java
  42. 80 5
      src/main/java/com/uas/platform/b2c/trade/order/controller/OrderController.java
  43. 15 2
      src/main/java/com/uas/platform/b2c/trade/order/controller/PurchaseController.java
  44. 47 0
      src/main/java/com/uas/platform/b2c/trade/order/model/Order.java
  45. 18 0
      src/main/java/com/uas/platform/b2c/trade/order/model/OrderDetail.java
  46. 24 0
      src/main/java/com/uas/platform/b2c/trade/order/model/OrderSimpleInfo.java
  47. 84 0
      src/main/java/com/uas/platform/b2c/trade/order/model/PayRecord.java
  48. 49 1
      src/main/java/com/uas/platform/b2c/trade/order/model/Purchase.java
  49. 18 0
      src/main/java/com/uas/platform/b2c/trade/order/model/PurchaseDetail.java
  50. 45 0
      src/main/java/com/uas/platform/b2c/trade/order/service/OrderService.java
  51. 13 3
      src/main/java/com/uas/platform/b2c/trade/order/service/PurchaseService.java
  52. 212 10
      src/main/java/com/uas/platform/b2c/trade/order/service/impl/OrderServiceImpl.java
  53. 283 32
      src/main/java/com/uas/platform/b2c/trade/order/service/impl/PurchaseServiceImpl.java
  54. 3 3
      src/main/resources/dev/jdbc.properties
  55. BIN
      src/main/resources/jxls-tpl/trade/bankTransfer.xls
  56. BIN
      src/main/resources/jxls-tpl/trade/payRecord.xls
  57. 3 3
      src/main/resources/prod/jdbc.properties
  58. 1 1
      src/main/resources/prod/sys.properties
  59. 10 1
      src/main/resources/spring/context.xml
  60. 3 3
      src/main/resources/test/jdbc.properties
  61. 1 0
      src/main/webapp/WEB-INF/spring/hessian.xml
  62. 65 3
      src/main/webapp/WEB-INF/views/normal/default/404.html
  63. 2 0
      src/main/webapp/WEB-INF/views/normal/user_center.html
  64. 7 2
      src/main/webapp/resources/css/common.css
  65. 621 0
      src/main/webapp/resources/css/commonComponent.css
  66. 555 0
      src/main/webapp/resources/css/pay.css
  67. BIN
      src/main/webapp/resources/img/icon/close.png
  68. BIN
      src/main/webapp/resources/img/icon/icon-no.png
  69. BIN
      src/main/webapp/resources/img/icon/icon-xiala.png
  70. BIN
      src/main/webapp/resources/img/icon/icon-yes.png
  71. BIN
      src/main/webapp/resources/img/icon/img.png
  72. BIN
      src/main/webapp/resources/img/icon/nummber-bg.png
  73. BIN
      src/main/webapp/resources/img/icon/pay-ok-icon.png
  74. BIN
      src/main/webapp/resources/img/icon/payment-add.png
  75. BIN
      src/main/webapp/resources/img/icon/payment-upload.png
  76. BIN
      src/main/webapp/resources/img/user/images/404.png
  77. 3 1
      src/main/webapp/resources/js/admin/controllers/checkMoney/SettlementCtrl.js
  78. 19 10
      src/main/webapp/resources/js/common/query/bankInfo.js
  79. 4 1
      src/main/webapp/resources/js/common/query/bankTransfer.js
  80. 27 0
      src/main/webapp/resources/js/common/query/installments.js
  81. 13 2
      src/main/webapp/resources/js/common/query/order.js
  82. 10 0
      src/main/webapp/resources/js/common/query/purchase.js
  83. 1 1
      src/main/webapp/resources/js/prod/controllers/KindAdviceCtrl.js
  84. 6 0
      src/main/webapp/resources/js/usercenter/app.js
  85. 1 1
      src/main/webapp/resources/js/usercenter/controllers/ComponentStoreCtrl.js
  86. 1 1
      src/main/webapp/resources/js/usercenter/controllers/forstore/browsing_history.js
  87. 192 192
      src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_cart_ctrl.js
  88. 144 0
      src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_down_payment_ctrl.js
  89. 1 0
      src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_home_ctrl.js
  90. 1 0
      src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_invoice_ctrl.js
  91. 1 1
      src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_invoice_record_ctrl.js
  92. 2 1
      src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_no_invoice_ctrl.js
  93. 61 2
      src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_order_ctrl.js
  94. 405 122
      src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_transfer_ctrl.js
  95. 1 1
      src/main/webapp/resources/js/usercenter/controllers/forstore/first_rate_ctrl.js
  96. 1 0
      src/main/webapp/resources/js/usercenter/controllers/forstore/order_detail_ctrl.js
  97. 20 4
      src/main/webapp/resources/js/usercenter/controllers/forstore/order_pay_ctrl.js
  98. 503 103
      src/main/webapp/resources/js/usercenter/controllers/forstore/pay_center_ctrl.js
  99. 1 1
      src/main/webapp/resources/js/usercenter/controllers/forstore/query_logistics_ctrl.js
  100. 1 0
      src/main/webapp/resources/js/usercenter/controllers/forstore/show_rate_ctrl.js

+ 13 - 11
src/main/java/com/uas/platform/b2c/common/account/controller/SecurityController.java

@@ -1,5 +1,7 @@
 package com.uas.platform.b2c.common.account.controller;
 
+import com.alibaba.fastjson.JSON;
+import com.uas.account.entity.UserView;
 import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.common.account.model.SigninLog;
 import com.uas.platform.b2c.common.account.model.User;
@@ -22,10 +24,7 @@ import org.springframework.mobile.device.LiteDeviceResolver;
 import org.springframework.mobile.device.site.SitePreference;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -60,21 +59,24 @@ public class SecurityController {
 	@RequestMapping(value = "/logout", method = RequestMethod.GET, headers = "Accept=application/json")
 	@ResponseStatus(value = HttpStatus.OK)
 	@ResponseBody
-	public ModelMap logout(HttpServletRequest request, HttpServletResponse response, HttpSession session, String returnUrl)
+	public String logout(HttpServletRequest request, HttpServletResponse response, HttpSession session, String returnUrl)
 			throws IOException {
+		String callback =request.getParameter("jsoncallback");
+		response.setContentType("text/html;charset=UTF-8");
 		session.invalidate();
 		SSOHelper.clearLogin(request, response);
 		SystemSession.clear();
 		if (StringUtils.isEmpty(returnUrl)) {
 			returnUrl = request.getHeader("Referer");
 		}
+		return "successCallback({success:'1'})";
 		/*boolean cross = SSOHelper.isCrossDomain(request);
 		if (cross) {
 			request.getSession().setAttribute(SSOConfig.SSOReferer, returnUrl);
 			// 跨域情况,需要再次询问账户中心
 			returnUrl = request.getContextPath() + "/logout/proxy";
 		}*/
-		return new ModelMap("content", returnUrl);
+		//return new ModelMap("content", returnUrl);
 	}
 
 	/**
@@ -199,14 +201,14 @@ public class SecurityController {
 	 */
 	@RequestMapping(value = "/login/other")
 	@ResponseBody
-	public String afterCrossLogin(HttpServletRequest request, HttpServletResponse response, String uid, long time , String data) {
+	public String afterCrossLogin(HttpServletRequest request, HttpServletResponse response, UserView userView) {
 		String callback =request.getParameter("jsoncallback");
 		response.setContentType("text/html;charset=UTF-8");
-		if (uid != null && data != null) {
+		if (userView != null && userView.getUid() != null) {
  				SSOToken tk = new SSOToken();
-				tk.setUid(uid);
-				tk.setTime(time);
-				tk.setData(data);
+				tk.setUid(userView.getUid());
+				tk.setTime(System.currentTimeMillis());
+				tk.setData(JSON.toJSONString(userView));
 				SSOHelper.setSSOCookie(request, response, tk, true);
 				User user = getUserByToken(tk);
 				if (user != null) {

+ 55 - 5
src/main/java/com/uas/platform/b2c/common/account/model/UsageLog.java

@@ -84,6 +84,24 @@ public class UsageLog extends BufferedLogable implements Serializable {
 	@Column(name = "rel_key")
 	private Long key;
 
+	/**
+	 * 电话
+	 */
+	@Column(name = "user_tel")
+	private String userTel;
+
+	/**
+	 * 邮箱
+	 */
+	@Column(name = "user_email")
+	private String userEmail;
+
+	/**
+	 * 姓名
+	 */
+	@Column(name = "user_name")
+	private String userName;
+
 	@JsonIgnore
 	@JSONField(serialize = false)
 	public Long getId() {
@@ -166,6 +184,8 @@ public class UsageLog extends BufferedLogable implements Serializable {
 		this.key = key;
 	}
 
+	@JsonIgnore
+	@JSONField(serialize = false)
 	public UserBaseInfo getUser() {
 		return user;
 	}
@@ -174,32 +194,62 @@ public class UsageLog extends BufferedLogable implements Serializable {
 		this.user = user;
 	}
 
+	public String getUserTel() {
+		if(user != null && user.getUserTel()!=null){
+			return user.getUserTel().substring(0,user.getUserTel().length()-(user.getUserTel().substring(3)).length())+"****"+user.getUserTel().substring(7);
+		}
+		return user.getUserTel();
+	}
+
+	public String getUserEmail() {
+		if(user != null && user.getUserEmail()!=null){
+			String email = user.getUserEmail();
+			int index = org.apache.commons.lang.StringUtils.indexOf(user.getUserEmail(), "@");
+			if (index <= 1)
+				return user.getUserEmail();
+			else
+				return org.apache.commons.lang.StringUtils.rightPad(org.apache.commons.lang.StringUtils.left(email, 1), index, "*").concat(org.apache.commons.lang.StringUtils.mid(email, index, org.apache.commons.lang.StringUtils.length(email)));
+		}
+		return user.getUserEmail();
+	}
+
+	public String getUserName() {
+		if(user.getUserName()!=null){
+			return user.getUserName().substring(0,1)+"**";
+		}
+		return user.getUserName();
+	}
+
 	public UsageLog() {
 
 	}
 
 	public UsageLog(String title, String message, String detail, String code, Long key) {
-		this.enUU = SystemSession.getUser().getEnterprise() != null ? SystemSession.getUser().getEnterprise().getUu() : null;
 		this.title = title;
 		this.message = message;
 		this.detail = detail;
 		this.code = code;
 		this.key = key;
 		this.time = new Date().getTime();
-		this.userUU = SystemSession.getUser().getUserUU();
-		this.ip = SystemSession.getUser().getIp();
+		if(SystemSession.getUser() != null) {
+			this.userUU = SystemSession.getUser().getUserUU();
+			this.enUU = SystemSession.getUser().getEnterprise() != null ? SystemSession.getUser().getEnterprise().getUu() : null;
+			this.ip = SystemSession.getUser().getIp();
+		}
 	}
 
 	public UsageLog(String title, String message, String detail, String code, Long key, Long enuu, Long useruu) {
 		this.enUU = enuu;
+		this.userUU = useruu;
 		this.title = title;
 		this.message = message;
 		this.detail = detail;
 		this.code = code;
 		this.key = key;
 		this.time = new Date().getTime();
-		this.userUU = useruu;
-		this.ip = SystemSession.getUser().getIp();
+		if(SystemSession.getUser() != null) {
+			this.ip = SystemSession.getUser().getIp();
+		}
 	}
 
 	public UsageLog(String title, String message, Long userUU, String ip, String code, Long key) {

+ 21 - 2
src/main/java/com/uas/platform/b2c/common/account/v2/service/impl/EnterpriseServiceImpl.java

@@ -16,7 +16,9 @@ import org.springframework.stereotype.Service;
 
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 @Service("v2.EnterpriseService")
 public class EnterpriseServiceImpl implements EnterpriseService {
@@ -34,6 +36,10 @@ public class EnterpriseServiceImpl implements EnterpriseService {
     @Override
     public void update(UserSpace userSpace, UserSpaceDetail userSpaceDetail) {
         Enterprise enterprise = new Enterprise();
+        if (null == userSpace.getDialectUID() && "".equals(userSpace.getDialectUID())){
+            logger.log("更新企业信息出错,uu为空", "值为null", null,0L);
+            return;
+        }
         Enterprise oldenterprise = enterpriseDao.findByUu(Long.valueOf(userSpace.getDialectUID()));
         enterprise.setEnAddress(userSpaceDetail.getAddress());
         enterprise.setEnArea(userSpaceDetail.getArea());
@@ -45,7 +51,20 @@ public class EnterpriseServiceImpl implements EnterpriseService {
         enterprise.setEnName(userSpaceDetail.getName());
         enterprise.setEnLogoUrl(userSpaceDetail.getBusinessCodeImage());
         enterprise.setUu(Long.valueOf(userSpace.getDialectUID()));
-        enterpriseDao.save(enterprise);
+        User adminUser = userDao.findUserByUserTel(userSpaceDetail.getAdminTel()).get(0);
+        Enterprise newEn = enterpriseDao.save(enterprise);
+        if (null != adminUser){
+            Set<Enterprise> enterprises = null;
+            if (null == adminUser.getEnterprises()){
+                enterprises = new HashSet<Enterprise>();
+            }else{
+                enterprises = adminUser.getEnterprises();
+            }
+            enterprises.add(newEn);
+            adminUser.setEnterprises(enterprises);
+            enterprise.setEnAdminuu(adminUser.getUserUU());
+            userDao.save(adminUser);
+        }
         if(null != oldenterprise) {
             logger.log("更新企业信息", enterprise.getUu()+"time: " + sdf.format(new Date()), enterprise.getUu(), 0L);
         } else {
@@ -62,7 +81,7 @@ public class EnterpriseServiceImpl implements EnterpriseService {
                 if(!CollectionUtils.isEmpty(users)) {
                     enterprise.setEnAdminuu(users.get(0).getUserUU());
                     enterpriseDao.save(enterprise);
-                    logger.log("更换管理员", enterprise.getEnName()+"," +users.get(0).getUserName() + "time:" + sdf.format(new Date()), enterprise.getUu(), enterprise.getEnAdminuu());
+                    logger.log("更换管理员", enterprise.getEnName() + ":" + enterprise.getUu() + ";" + enterprise.getEnAdminuu());
                 }
             }
         }

+ 47 - 40
src/main/java/com/uas/platform/b2c/common/account/v2/service/impl/UserServiceImpl.java

@@ -5,24 +5,23 @@ import com.uas.platform.b2c.common.account.dao.EnterpriseDao;
 import com.uas.platform.b2c.common.account.dao.UserDao;
 import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.common.account.v2.service.UserService;
-import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.support.log.UsageBufferedLogger;
 import com.uas.platform.core.logging.BufferedLoggerManager;
 import com.uas.platform.core.model.Status;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.List;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.text.SimpleDateFormat;
+import java.util.*;
+
 
 @Service("v2.UserService")
 public class UserServiceImpl implements UserService {
 
-	@Autowired
-	private UserDao userDao;
+    @Autowired
+    private UserDao userDao;
 
-	@Autowired
+    @Autowired
     private EnterpriseDao enterpriseDao;
 
     private static final UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
@@ -31,65 +30,73 @@ public class UserServiceImpl implements UserService {
 
     @Override
     public void save(User user) {
-        com.uas.platform.b2c.common.account.model.User u = null;
-        if(user.getDialectUID()!=null){
-            u = userDao.findOne(Long.parseLong(user.getDialectUID()));
-        }else if(user.getUid()!=null){
-            u = userDao.findUserByUserTel(user.getUid()).size()>0?userDao.findUserByUserTel(user.getUid()).get(0):null;
-        }
-
-        if (null == u){
-            u =  new com.uas.platform.b2c.common.account.model.User();
+        com.uas.platform.b2c.common.account.model.User u = userDao.findOne(Long.parseLong(user.getDialectUID()));
+        if (null == u) {
+            u = new com.uas.platform.b2c.common.account.model.User();
         }
         u.setUserPwd(user.getPassword());
         u.setUserName(user.getName());
+        u.setUserTel(user.getUid());
         u.setEnable((short) 1);
         u.setUserEmail(user.getSecondUID());
-        if(user.getDialectUID()!=null){
-            u.setUserUU(Long.valueOf(user.getDialectUID()));
+        u.setUserUU(Long.valueOf(user.getDialectUID()));
+        Enterprise enterprise = enterpriseDao.findByUu(Long.valueOf(user.getSpaceDialectUID()));
+        if (null != enterprise) {
+            u.setEnterprise(enterprise);
+            if (null == enterprise.getEnAdminuu()) {
+                enterprise.setEnAdminuu(u.getUserUU());
+                enterpriseDao.save(enterprise);
+                logger.log("设置管理员", enterprise.getEnName() + ":" + enterprise.getUu() + ";" + u.getUserName() + ":" + u.getUserUU());
+            }
         }
-        u.setUserTel(user.getUid());
-        //添加密码强度以及最后一次登录时间
-        u.setPwdSecLevel(user.getPwdSecLevel());
-        u.setLastLoginTime(user.getLastLoginTime());
-        Enterprise enterprise = null;
-        if(user.getSpaceDialectUID()!=null){
-            enterprise= enterpriseDao.findByUu(Long.valueOf(user.getSpaceDialectUID()));
-            if(null != enterprise) {
+
+        //将该成员添加至企业
+        Set<Enterprise> ens = u.getEnterprises();
+        Iterator<Enterprise> it = ens.iterator();
+        boolean isMember = false;
+        while (it.hasNext()) {
+            if (it.next().getUu() == enterprise.getUu()) {
+                isMember = true;
+            }
+        }
+        if (!isMember) {
+            Set<Enterprise> enterprises = null;
+            if (null == u.getEnterprises()) {
+                enterprises = new HashSet<Enterprise>();
+            } else {
+                enterprises = u.getEnterprises();
+            }
+            if (null != enterprise) {
                 u.setEnterprise(enterprise);
+                enterprises.add(enterprise);
             }
+            u.setEnterprises(enterprises);
         }
         List<com.uas.platform.b2c.common.account.model.User> oldUsers = userDao.findUserByUserUU(u.getUserUU());
-        com.uas.platform.b2c.common.account.model.User newUser = userDao.save(u);
-        SystemSession.setUser(newUser);
-        if(oldUsers.size() > 0) {
-            logger.log("更新用户信息", u.getUserUU() + "time: " + sdf.format(new Date()), enterprise.getUu()==null?null:enterprise.getUu(), u.getUserUU());
+        userDao.save(u);
+        if (oldUsers.size() > 0) {
+            logger.log("更新用户信息", user.getDialectUID() + "" + enterprise.getUu());
         } else {
-            if(null != enterprise && null == enterprise.getEnAdminuu()) {
-                enterprise.setEnAdminuu(u.getUserUU());
-                enterpriseDao.save(enterprise);
-                logger.log("设置管理员", enterprise.getEnName() + "," + u.getUserName() + "time: " + sdf.format(new Date()), enterprise.getUu(), u.getUserUU());
-            }
-            logger.log("新增用户信息", user.getDialectUID() + "time: " + sdf.format(new Date()), enterprise.getUu(), u.getUserUU());
+            logger.log("新增用户信息", user.getDialectUID() + ", " + enterprise.getUu());
         }
-    }
 
+    }
 
     @Override
     public void delete(Long uu, Long enuu) {
         com.uas.platform.b2c.common.account.model.User user = userDao.findOne(uu);
         Enterprise enterprise = enterpriseDao.findByUu(enuu);
-        if(null != user && null != enterprise) {
+        if (null != user && null != enterprise) {
             if (user.getEnterprises().contains(enterprise)) {
                 user.removeEnterprise(enterprise);
                 if (user.getEnterprises().size() != 0) {
                     user.setEnable((short) Status.DISABLED.value());
-                    logger.log("删除用户", "禁用" + user.getUserUU(), 0L, 0L);
+                    logger.log("删除用户", "禁用" + user.getUserUU(), enuu, uu);
                     userDao.save(user);
                 }
                 if (user.getEnterprises().size() == 0) {
                     userDao.delete(user);
-                    logger.log("删除用户", "删除" + user.getUserUU(), 0L, 0L);
+                    logger.log("删除用户", "删除" + user.getUserUU(), enuu, uu);
                 }
             }
         }

+ 10 - 0
src/main/java/com/uas/platform/b2c/common/base/service/SendMessageService.java

@@ -27,4 +27,14 @@ public interface SendMessageService {
 	 * @param type 消息类型
 	 */
 	public void sendMessageForOrderSucess(String sellername, int num, String userPhone, MessageType type);
+
+	/**
+	 * 分期付款后发送信息给卖家
+	 * @param enName 卖家企业名称
+	 * @param uuName 买家姓名
+	 * @param amount 付款金额
+	 * @param userPhone 发送手机号
+	 * @param type 消息类型
+	 */
+	public void sendMessageForInstallmentPay(String enName, String uuName, Double amount, String userPhone, MessageType type);
 }

+ 11 - 1
src/main/java/com/uas/platform/b2c/common/base/service/impl/SendMessageServiceImpl.java

@@ -58,5 +58,15 @@ public class SendMessageServiceImpl implements SendMessageService {
 		}
 	}
 
-
+	@Override
+	public void sendMessageForInstallmentPay(String enName, String uuName, Double amount, String userPhone, MessageType type) {
+		try {
+			Set<String> userPhones = new HashSet<>();
+			userPhones.add(userPhone);
+			Object[] obj = {enName, uuName, amount};
+			smsService.sendAll("154fa7d4-adef-4318-80a4-60389a43ecaf",userPhones,obj);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
 }

+ 11 - 1
src/main/java/com/uas/platform/b2c/core/config/MicroServicesConf.java

@@ -28,6 +28,12 @@ public class MicroServicesConf {
 	@Value("#{sys.floorMicroServiceIp ?: '10.10.0.30'}")
 	private String floorMicroServiceIp;
 
+	/**
+	 * profile
+	 */
+	@Value("#{sys.profile}")
+	private String profile;
+
 	/**
 	 * 轮播
 	 */
@@ -71,7 +77,11 @@ public class MicroServicesConf {
 	}
 
 	public String getRequestUrlForNews(String requestUrl) {
-		return String.format("http://%s%s", this.newsMicroServiceIp, requestUrl);
+		if ("prod".equals(profile)){
+			return String.format("http://%s%s", this.newsMicroServiceIp, requestUrl);
+		}else {
+			return String.format("http://%s:%d%s", this.microServiceIp, 20210, requestUrl);
+		}
 	}
 
 	public String getRequestUrlForFloor(int port, String requestUrl) {

+ 16 - 0
src/main/java/com/uas/platform/b2c/core/constant/Status.java

@@ -31,6 +31,10 @@ public enum Status {
 	 * {@code 104 已通过}
 	 */
 	ALLOW(104, "已通过"),
+	/**
+	 * {@code 104 已通过}
+	 */
+	EXPIRED(105, "已失效"),
 	/**
 	 * {@code 111 已结束}
 	 */
@@ -179,6 +183,18 @@ public enum Status {
 	 * {@code 503 待付款}
 	 */
 	TOBEPAID(503, "待付款"),
+	/**
+	 * {@code 525 卖家取消申请待确认}
+	 */
+	CANCELTOBECONFIRMED(525, "卖家取消申请待确认"),
+	/**
+	 * {@code 524 待继续分期付款}
+	 */
+	TOBEPAIDAGAGIN(524, "待继续分期付款"),
+	/**
+	 * {@code 523 付款中}
+	 */
+	PAIDING(523, "付款中"),
 	/**
 	 * {@code 504 已付款}
 	 */

+ 10 - 0
src/main/java/com/uas/platform/b2c/core/constant/Type.java

@@ -251,6 +251,16 @@ public enum Type {
 	 */
 	ENTERPRISING(1602, "ENTERPRISING"),
 
+	/**
+	 * 付款给平台
+	 */
+	PAIDTOPLATFORM(1603, "PAIDTOPLATFORM"),
+
+	/**
+	 * 付款给卖家
+	 */
+	PAIDTOVENDOR(1604, "PAIDTOVENDOR"),
+
 	/**
 	 * {@code 1666 企业入库 <b>企业入库</b>}
 	 */

+ 14 - 3
src/main/java/com/uas/platform/b2c/core/filter/KeyWordFilter.java

@@ -14,6 +14,7 @@ import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.log4j.Logger;
 import org.springframework.util.StringUtils;
 import org.springframework.web.context.support.WebApplicationContextUtils;
 import org.springframework.web.context.support.XmlWebApplicationContext;
@@ -23,12 +24,19 @@ import org.springframework.web.context.support.XmlWebApplicationContext;
  * @author liusw
  */
 public class KeyWordFilter implements Filter {
+
     public static Set<String> keyworsSet = null;
 
+    /**
+     * hessian 请求路径前缀
+     */
+    private static String HESSIAN_URI_PREFIX = "/api/service/";
+
+    private Logger logger = Logger.getLogger(this.getClass());
+
     @Override
     public void destroy() {
         // TODO Auto-generated method stub
-
     }
 
     @Override
@@ -40,8 +48,11 @@ public class KeyWordFilter implements Filter {
         response.setContentType("application/json; charset=utf-8");
         String contentType = req.getContentType();
         String method = req.getMethod();
-        // POST请求 或 PUT请求,并且不是附件上传请求
-        if(("POST".equals(method) || "PUT".equals(method)) && (StringUtils.isEmpty(contentType) || !contentType.contains("multipart"))){
+        String uri = req.getRequestURI();
+        // POST请求 或 PUT请求,并且不是附件上传请求,并且不是hessian请求
+        if(("POST".equals(method) || "PUT".equals(method)) &&
+                (StringUtils.isEmpty(contentType) || !contentType.contains("multipart")) &&
+                !uri.contains(HESSIAN_URI_PREFIX)){
             //注入Service
             ServletContext sc = req.getSession().getServletContext();
             XmlWebApplicationContext cxt = (XmlWebApplicationContext) WebApplicationContextUtils.getWebApplicationContext(sc);

+ 39 - 0
src/main/java/com/uas/platform/b2c/core/support/EncryptablePropertyPlaceholderConfigurer.java

@@ -0,0 +1,39 @@
+package com.uas.platform.b2c.core.support;
+
+import com.uas.platform.core.util.Des;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.BeanInitializationException;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
+
+import java.util.Properties;
+
+public class EncryptablePropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
+    private static final String key = "10101010";
+
+    protected void processProperties(ConfigurableListableBeanFactory beanFactory, Properties props)
+            throws BeansException {
+        try {
+            Des des = new Des();
+            String username = props.getProperty("jdbc.username");
+            if (username != null) {
+                props.setProperty("jdbc.username", des.decrypt(username, key));
+            }
+
+            String password = props.getProperty("jdbc.password");
+            if (password != null) {
+                props.setProperty("jdbc.password", des.decrypt(password, key));
+            }
+
+            String url = props.getProperty("jdbc.url");
+            if (url != null) {
+                props.setProperty("jdbc.url", des.decrypt(url, key));
+            }
+
+            super.processProperties(beanFactory, props);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new BeanInitializationException(e.getMessage());
+        }
+    }
+}

+ 25 - 5
src/main/java/com/uas/platform/b2c/core/support/log/UsageBufferedLogger.java

@@ -28,7 +28,11 @@ public class UsageBufferedLogger extends BufferedLogger<UsageLog> {
 	 *            消息
 	 */
 	public void log(String title, String message) {
-		log(new UsageLog(title, message, null, null, null));
+		try {
+			log(new UsageLog(title, message, null, null, null));
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
 	}
 
 	/**
@@ -40,7 +44,11 @@ public class UsageBufferedLogger extends BufferedLogger<UsageLog> {
 	 *            消息
 	 */
 	public void log(String title, String message, Long enuu, Long useruu) {
-		log(new UsageLog(title, message, null, null, null, enuu, useruu));
+		try {
+			log(new UsageLog(title, message, null, null, null, enuu, useruu));
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
 	}
 
 	/**
@@ -52,7 +60,11 @@ public class UsageBufferedLogger extends BufferedLogger<UsageLog> {
 	 *            消息
 	 */
 	public void log(String title, String message, Long userUU, String ip) {
-		log(new UsageLog(title, message, userUU, ip, null, null));
+		try {
+			log(new UsageLog(title, message, userUU, ip, null, null));
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
 	}
 
 	/**
@@ -66,7 +78,11 @@ public class UsageBufferedLogger extends BufferedLogger<UsageLog> {
 	 *            消息详细描述
 	 */
 	public void log(String title, String message, String description) {
-		log(new UsageLog(title, message, description, null, null));
+		try {
+			log(new UsageLog(title, message, description, null, null));
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
 	}
 
 	/**
@@ -84,7 +100,11 @@ public class UsageBufferedLogger extends BufferedLogger<UsageLog> {
 	 *            相关单据主键
 	 */
 	public void log(String title, String message, String description, String relativeCode, Long relativeKey) {
-		log(new UsageLog(title, message, description, relativeCode, relativeKey));
+		try {
+			log(new UsageLog(title, message, description, relativeCode, relativeKey));
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
 	}
 
 }

+ 1 - 1
src/main/java/com/uas/platform/b2c/external/erp/order/api/PurchaseController.java

@@ -229,7 +229,7 @@ public class PurchaseController {
      */
     @RequestMapping(value = "/{id}/ensurePaid", method = RequestMethod.PUT)
 	public Purchase ensurePaid(@PathVariable Long id) {
-		return purchaseService.ensurePaid(id);
+		return purchaseService.ensurePaid(id, null);
 	}
 
     /**

+ 32 - 20
src/main/java/com/uas/platform/b2c/fa/payment/controller/BankInfoController.java

@@ -53,9 +53,9 @@ public class BankInfoController {
 	 */
 	@RequestMapping(value="/buy/personal", method=RequestMethod.GET, params = "type=buyer")
 	@ApiOperation(value = "获取买家个人银行账户", httpMethod = "GET")
-	public List<BankInfo> getPersonalBank() {
+	public Page<BankInfo> getPersonalBank(PageParams params) {
 		logger.log("银行账户信息", "获取个人银行账户信息");
-		return bankInfoService.getPersonBankInfo(Type.BUYER.value());
+		return bankInfoService.getPersonBankInfo(params, Type.BUYER.value());
 	}
 
 	/**
@@ -86,6 +86,7 @@ public class BankInfoController {
 	}
 
 	/**
+	 * 分页获取卖家账户信息,已修改
 	 * 获取供应商审核通过的信息
 	 * 2016年3月15日 下午5:16:00
 	 *
@@ -99,6 +100,20 @@ public class BankInfoController {
 		return bankInfoService.getEnterpriseBankInfoContainsStatus(Type.SUP.value(), Status.ALLOW.value());
 	}
 
+	/**
+	 * 获取供应商审核通过的信息
+	 * 2016年3月15日 下午5:16:00
+	 *
+	 * @return list
+	 * @author yujia
+	 */
+	@RequestMapping(value="/sale/enterprise/{enuu}", method=RequestMethod.GET, params = {"type=sup", "status=104"})
+	@ApiOperation(value = "获取供应商审核通过的信息", httpMethod = "GET")
+	public List<BankInfo> getSaleBankInfoAudit(@PathVariable("enuu") Long enuu) {
+		logger.log("银行账户信息", "获取供应商银行账户信息");
+		return bankInfoService.getEnterpriseBankInfoContainsStatus(Type.SUP.value(), Status.ALLOW.value(), enuu);
+	}
+
 	/**
 	 * 获取供应商账户信息
 	 * 2016年3月15日 下午5:16:00
@@ -108,9 +123,9 @@ public class BankInfoController {
 	 */
 	@RequestMapping(value="/sale/enterprise", method=RequestMethod.GET, params = "type=sup")
 	@ApiOperation(value = "获取供应商账户信息", httpMethod = "GET")
-	public List<BankInfo> getSaleBankInfo() {
+	public Page<BankInfo> getSaleBankInfo(PageParams params) {
 		logger.log("银行账户信息", "获取供应商银行账户信息");
-		return bankInfoService.getEnterpriseBankInfo(Type.SUP.value());
+		return bankInfoService.getSupBankInfo(params, Type.SUP.value());
 	}
 
 	/**
@@ -124,21 +139,7 @@ public class BankInfoController {
 	@ApiOperation(value = "保存新增个人银行账户", httpMethod = "POST")
 	public BankInfo savePersonalBank(@ApiParam(required = true, value = "保存的银行账户信息") @RequestBody BankInfo bankInfo) {
 		logger.log("银行账户信息", "保存个人银行账户信息" + bankInfo.getBankname() + "-" + bankInfo.getNumber() + "-" + bankInfo.getAccountname());
-		return bankInfoService.save(bankInfo, true, Type.BUYER.value());
-	}
-
-	/**
-	 * @author yujia  保存新增买家企业银行账户
-	 *
-	 * @param bankInfo 银行信息
-	 * @return BankInfo
-	 */
-	@RequestMapping(value="/save/enterprise", method=RequestMethod.POST, params = "type=buyer")
-	@ResponseBody
-	@ApiOperation(value = "保存新增买家企业银行账户", httpMethod = "POST")
-	public BankInfo saveEnterpriseBank(@ApiParam(required = true, value = "保存的银行账户信息") @RequestBody BankInfo bankInfo) {
-		logger.log("银行账户信息", "保存企业银行账户信息" + bankInfo.getBankname() + "-" + bankInfo.getNumber() + "-" + bankInfo.getAccountname() +"操作人"+ SystemSession.getUser().getUserUU());
-		return bankInfoService.save(bankInfo, false, Type.BUYER.value());
+		return bankInfoService.save(bankInfo, Type.BUYER.value());
 	}
 
 	/**
@@ -154,7 +155,7 @@ public class BankInfoController {
 	public BankInfo saveSupEnterpriseBank(@ApiParam(required = true, value = "银行账户json字符串") String bankInfo, @ApiParam(required = true, value = "上传附件") FileUpload uploadItem) {
 		logger.log("银行账户信息", "保存卖家企业银行账户信息 " + bankInfo);
 		BankInfo bank = FastjsonUtils.fromJson(bankInfo, BankInfo.class);
-		return bankInfoService.save(bank, false, Type.SUP.value(), uploadItem);
+		return bankInfoService.save(bank, Type.SUP.value(), uploadItem);
 	}
 
 	/**
@@ -287,4 +288,15 @@ public class BankInfoController {
 		logger.log("银行账户信息", "审核银行账户为id:" + id  + "通过");
 		return resultMap;
 	}
+
+	/**
+	 * 根据银行账号返回账户数
+	 * @param number 银行账号
+	 * @param type   类型,卖家、买家、平台
+	 * @return
+	 */
+	@RequestMapping(value = "/number/count", method = RequestMethod.GET)
+	public ResultMap getCountByNumber(Integer type, String number){
+		return bankInfoService.getCountByNumber(type, number);
+	}
 }

+ 46 - 2
src/main/java/com/uas/platform/b2c/fa/payment/controller/BankTransferController.java

@@ -2,11 +2,13 @@ package com.uas.platform.b2c.fa.payment.controller;
 
 
 import com.uas.platform.b2c.core.config.SysConf;
+import com.uas.platform.b2c.core.support.view.JxlsExcelView;
 import com.uas.platform.b2c.fa.payment.model.BankInfo;
 import com.uas.platform.b2c.fa.payment.model.BankTransfer;
 import com.uas.platform.b2c.fa.payment.service.BankTransferService;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.support.log.UsageBufferedLogger;
+import com.uas.platform.b2c.trade.order.model.OrderSimpleInfo;
 import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.logging.BufferedLoggerManager;
 import com.uas.platform.core.model.PageInfo;
@@ -18,6 +20,14 @@ import com.wordnik.swagger.annotations.ApiParam;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * The type Bank transfer controller.
@@ -231,7 +241,41 @@ public class BankTransferController {
 	 */
 	@RequestMapping(value = "/vendor/bankTransfer/page", method = RequestMethod.GET, params = "type=sup")
 	@ApiOperation(value = "获取供应商的的收款转账单", httpMethod = "GET")
-	public ResultMap getVendorBankTransferByMall(@ApiParam(required = true, value = "分页参数") PageParams params) {
-		return bankTransferService.getVendorBankTransferByMall(params, Type.SUP.value());
+	public ResultMap getVendorBankTransferByMall(@ApiParam(required = true, value = "分页参数") PageParams params,
+												String keyword, Long fromDate, Long toDate) {
+		return bankTransferService.getVendorBankTransferByMall(params, Type.SUP.value(), keyword, fromDate, toDate);
+	}
+
+	/**
+	 * 导出收款记录到excel表中
+	 * @param isAjax
+	 * @param request
+	 * @param keyword
+	 * @param fromDate
+	 * @param toDate
+	 * @return
+	 */
+	@RequestMapping(value = "/export/bankTransfer", method = RequestMethod.POST)
+	public ModelAndView exportPayRecordToExcel(@RequestParam(required = false, value = "isAjax", defaultValue = "false")Boolean isAjax, HttpServletRequest request,
+											   String keyword, Long fromDate, Long toDate){
+		HttpSession session = request.getSession();
+		ModelAndView modelAndView = new ModelAndView();
+		Object loading = session.getAttribute("loading");
+		if(isAjax) {
+			MappingJackson2JsonView view = new MappingJackson2JsonView();
+			Map<String, Boolean> attributes = new HashMap<>();
+			Boolean isLoading= loading == Boolean.TRUE;
+			attributes.put("loading", isLoading);
+			view.setAttributesMap(attributes);
+			modelAndView.setView(view);
+			return modelAndView;
+		}
+		session.setAttribute("loading", true);
+		List<BankTransfer> data = bankTransferService.getExportData(Type.SUP.value(), keyword, fromDate, toDate);
+		modelAndView.addObject("data", data);
+		modelAndView.addObject("operator", "+");
+		modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/bankTransfer", "优软商城-卖家交易记录"));
+		session.setAttribute("loading", false);
+		return modelAndView;
 	}
 }

+ 71 - 0
src/main/java/com/uas/platform/b2c/fa/payment/controller/InstallmentController.java

@@ -0,0 +1,71 @@
+package com.uas.platform.b2c.fa.payment.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.uas.platform.b2c.core.utils.FastjsonUtils;
+import com.uas.platform.b2c.fa.payment.model.Installment;
+import com.uas.platform.b2c.fa.payment.service.InstallmentService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 分期消息controller
+ * @author wangyc
+ *
+ * @version 2017/9/7 8:56 wangyc
+ */
+@RestController
+@RequestMapping(value = "/trade/installments")
+public class InstallmentController {
+
+    private final InstallmentService installmentService;
+
+    @Autowired
+    public InstallmentController(InstallmentService installmentService) {
+        this.installmentService = installmentService;
+    }
+
+    /**
+     * 新增分期信息
+     * @param json 分期信息及采购单号
+     * @return
+     */
+    @RequestMapping(method = RequestMethod.POST)
+    public Installment createInstallment(@RequestBody String json) {
+        JSONObject jsonObject = FastjsonUtils.fromJson(json, JSONObject.class);
+        Installment installment = FastjsonUtils.fromJson(jsonObject.get("installment").toString(), Installment.class);
+        Long purchaseId = jsonObject.getLong("purchaseId");
+        return installmentService.createInstallment(installment, purchaseId);
+    }
+
+    /**
+     * 更新分期信息
+     * @param json 分期信息及采购单号
+     * @return
+     */
+    @RequestMapping(method = RequestMethod.PUT)
+    public Installment updateInstallment(@RequestBody String json) {
+        JSONObject jsonObject = FastjsonUtils.fromJson(json, JSONObject.class);
+        Installment installment = FastjsonUtils.fromJson(jsonObject.get("installment").toString(), Installment.class);
+        Long purchaseId = jsonObject.getLong("purchaseId");
+        return installmentService.updateInstallment(installment, purchaseId);
+    }
+
+    /**
+     * 删除分期信息
+     * @param purchaseId 采购单id
+     */
+    @RequestMapping(value = "/{purchaseId}", method = RequestMethod.DELETE)
+    public void deleteInstallment(@PathVariable("purchaseId") Long purchaseId) {
+        installmentService.deleteInstallment(purchaseId);
+    }
+
+    /**
+     * 验证是否能启用分期信息
+     * @param purchaseId 采购单id
+     * @return
+     */
+    @RequestMapping(value = "/{purchaseId}/validate", method = RequestMethod.GET)
+    public String validateEnableInstallment(@PathVariable("purchaseId") Long purchaseId) {
+        return installmentService.validationEnableInstallment(purchaseId);
+    }
+}

+ 71 - 0
src/main/java/com/uas/platform/b2c/fa/payment/controller/InstallmentStoreController.java

@@ -0,0 +1,71 @@
+package com.uas.platform.b2c.fa.payment.controller;
+
+import com.uas.platform.b2c.fa.payment.model.InstallmentStore;
+import com.uas.platform.b2c.fa.payment.service.InstallmentStoreService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 分期权限店铺controller
+ * @author wangyc
+ *
+ * @version 2017/9/7 11:21 wangyc
+ */
+@RestController
+@RequestMapping("trade/installment-stores")
+public class InstallmentStoreController {
+
+    private final InstallmentStoreService installmentStoreService;
+
+    @Autowired
+    public InstallmentStoreController(InstallmentStoreService installmentStoreService) {
+        this.installmentStoreService = installmentStoreService;
+    }
+
+    /**
+     * 分期权限店铺的保存功能
+     * @param storeUuid 店铺uuid
+     */
+    @RequestMapping(value = "/{storeUuid}", method = RequestMethod.POST)
+    public InstallmentStore saveStore(@PathVariable("storeUuid") String storeUuid) {
+        return installmentStoreService.saveStore(storeUuid);
+    }
+
+    /**
+     * 分期权限店铺的删除功能
+     * @param storeUuid 店铺uuid
+     */
+    @RequestMapping(value = "/{storeUuid}", method = RequestMethod.DELETE)
+    public void deleteStore(@PathVariable("storeUuid") String storeUuid) {
+        installmentStoreService.deleteStore(storeUuid);
+    }
+
+    /**
+     * 分期权限店铺的禁用功能
+     * @param storeUuid 店铺uuid
+     */
+    @RequestMapping(value = "/disable/{storeUuid}", method = RequestMethod.PUT)
+    public InstallmentStore capsOFF(@PathVariable("storeUuid") String storeUuid) {
+        return installmentStoreService.capsOFF(storeUuid);
+    }
+
+    /**
+     * 分期权限店铺的启用功能
+     * @param storeUuid 店铺uuid
+     */
+    @RequestMapping(value = "/enable/{storeUuid}", method = RequestMethod.PUT)
+    public InstallmentStore capsON(@PathVariable("storeUuid") String storeUuid) {
+        return installmentStoreService.capsON(storeUuid);
+    }
+
+    /**
+     * 分期权限店铺开启分期功能的验证
+     */
+    @RequestMapping(value = "/capsOFFVerify", method = RequestMethod.GET)
+    public String capsOFFVerify() {
+        return installmentStoreService.capsOFFVerify();
+    }
+}

+ 75 - 41
src/main/java/com/uas/platform/b2c/fa/payment/dao/BankInfoDao.java

@@ -19,101 +19,135 @@ import java.util.List;
 public interface BankInfoDao extends CrudRepository<BankInfo, Long>, JpaSpecificationExecutor<BankInfo>, GenericRepository<BankInfo, Long> {
 
 	/**
-	 * 根据企业enuu类型,状态和操作人类型获取所有银行账户信息
+	 * 返回卖家账户信息列表 --除被删除的状态
 	 *
 	 * @param enuu 企业enuu
-	 * @param type 账户类型
 	 * @param status 状态
 	 * @param opraterUserType 操作人类型
 	 * @return
 	 */
-	@Query(value = "select b from BankInfo b where b.enuu =:enuu and b.type =:type and b.status =:status and b.opraterUserType=:opraterUserType order by num")
-	List<BankInfo> findByEnuuAndTypeAndStatusAndOpraterUserTypeOrderByNumAsc(@Param("enuu") Long enuu, @Param("type") Short type, @Param("status") Integer status, @Param("opraterUserType") Integer opraterUserType);
+	@Query(value = "select b from BankInfo b where b.enuu =:enuu and b.opraterUserType=:opraterUserType and b.status in :status order by num")
+	List<BankInfo> findSupBankList(@Param("enuu") Long enuu, @Param("opraterUserType") Integer opraterUserType, @Param("status") List<Integer> status);
+
+	/**
+	 * 返回账户信息,兼容type版本
+	 * @param enuu
+	 * @param status
+	 * @param opraterUserType
+	 * @return
+	 */
+	List<BankInfo> findByEnuuAndStatusAndOpraterUserTypeOrderByNumAsc(Long enuu, Integer status, Integer opraterUserType);
 
 	/**
 	 * 根据下面参数获取企业账户信息
 	 * @param enuu 企业的enuu
-	 * @param type 企业的类型
 	 * @param opraterUserType 所属类型 买家 卖家,平台
 	 * @return list
 	 */
-	@Query(value = "select b from BankInfo b where b.enuu =:enuu and b.type =:type and b.opraterUserType=:opraterUserType order by num")
-	List<BankInfo> findByEnuuAndTypeAndOpraterUserTypeOrderByNumAsc(@Param("enuu") Long enuu, @Param("type") Short type, @Param("opraterUserType") Integer opraterUserType);
+	@Query(value = "select b from BankInfo b where b.enuu =:enuu and b.opraterUserType=:opraterUserType order by num")
+	List<BankInfo> findByEnuuAndOpraterUserTypeOrderByNumAsc(@Param("enuu") Long enuu, @Param("opraterUserType") Integer opraterUserType);
 
 	/**
 	 * 根据下面参数获取企业账户信息
 	 *
 	 * @param useruu 个人uu
 	 * @param enuu 企业enuu
-	 * @param type 账户类型
 	 * @param opraterUserType 操作人的类型
-	 * @param Status 状态
+	 * @param status 状态
 	 * @return list
 	 */
-	List<BankInfo> findByUseruuAndEnuuAndTypeAndOpraterUserTypeAndStatusOrderByNumAsc(Long useruu, Long enuu, Short type, Integer opraterUserType, Integer Status);
+	List<BankInfo> findByUseruuAndEnuuAndOpraterUserTypeAndStatusOrderByNumAsc(Long useruu, Long enuu, Integer opraterUserType, Integer status);
 
 	/**
-	 * 根据下面参数获取企业账户信息
+	 * 返回买家账户信息列表  --无enuu
 	 *
-	 * @param useruu 个人uu
-	 * @param dissociative 是否个人用户
- 	 * @param type 账户类型
-	 * @param opraterUserType 操作人的类型
-	 * @param Status 状态
-	 * @return list
+	 * @param useruu
+	 * @param dissociative
+	 * @param operateUserType
+	 * @param status
+	 * @return
 	 */
-//	@Query("select b from BankInfo b  where b.useruu=:useruu and b.dissociative=:dissociative and b.type=:type and b.opraterUserType=:opraterUserType and b.status=:status")
-	List<BankInfo> findByUseruuAndDissociativeAndTypeAndOpraterUserTypeAndStatusOrderByNumAsc(Long useruu, Integer dissociative, Short type, Integer opraterUserType, Integer Status);
+	List<BankInfo> findByUseruuAndDissociativeAndOpraterUserTypeAndStatusOrderByNumAsc(Long useruu, Integer dissociative, Integer operateUserType, Integer status);
 
 	/**
-	 * 获取当前的个人账户数
+	 * 获取买家账户数 --有enuu
 	 *
 	 * @param useruu 个人uu
 	 * @param enuu 企业enuu
-	 * @param type 账户类型
 	 * @param operateUserType 操作人的类型
 	 * @param status 状态
 	 * @return int 返回总数
 	 */
-	@Query("select count(b) from BankInfo b where b.useruu=:useruu and b.enuu =:enuu and b.type =:type and b.opraterUserType=:operateUserType and b.status =:status")
-	int getKindCountByUseruuAndStatus(@Param("useruu") Long useruu, @Param("enuu") Long enuu, @Param("type") short type, @Param("operateUserType") Integer operateUserType, @Param("status") Integer status);
+	@Query("select count(b) from BankInfo b where b.useruu=:useruu and b.enuu =:enuu and b.opraterUserType=:operateUserType and b.status =:status")
+	int getCountByUseruuAndStatus(@Param("useruu") Long useruu, @Param("enuu") Long enuu, @Param("operateUserType") Integer operateUserType, @Param("status") Integer status);
 
 	/**
-	 * 获取当前的个人账户数enuu为空
+	 * 获取买家账户数 --无enuu
 	 *
 	 * @param useruu 个人uu
 	 * @param dissociative 个人用户
- 	 * @param type 账户类型
 	 * @param operateUserType 操作人类型
 	 * @param status 状态
 	 * @return int 返回总数
 	 */
-	@Query("select count(b) from BankInfo b where b.useruu=:useruu and b.dissociative=:dissociative and b.type =:type and b.opraterUserType=:operateUserType and b.status =:status")
-	int getKindCountByUseruuAndStatusAndDissociative(@Param("useruu") Long useruu, @Param("dissociative") Integer dissociative, @Param("type") short type, @Param("operateUserType") Integer operateUserType, @Param("status") Integer status);
+	@Query("select count(b) from BankInfo b where b.useruu=:useruu and b.dissociative=:dissociative and b.opraterUserType=:operateUserType and b.status =:status")
+	int getCountByUseruuAndStatusAndDissociative(@Param("useruu") Long useruu, @Param("dissociative") Integer dissociative, @Param("operateUserType") Integer operateUserType, @Param("status") Integer status);
 
 	/**
-	 * 获取当前的企业账户数
+	 * 获取卖家的企业账户数
 	 *
 	 * @param enuu 企业enuu
-	 * @param type 账户类型
 	 * @param operateUserType 操作人的类型
-	 * @param status 状态
 	 * @return
 	 */
-	@Query("select count(b) from BankInfo b where b.enuu=:enuu and b.type =:type and b.opraterUserType=:operateUserType and b.status =:status")
-	int getKindCountByEnuuAndStatus(@Param("enuu") Long enuu, @Param("type") Short type, @Param("operateUserType") Integer operateUserType, @Param("status") Integer status);
-
+	@Query("select count(b) from BankInfo b where b.enuu=:enuu and b.opraterUserType=:operateUserType and b.status in :status")
+	int getCountByEnuuAndStatus(@Param("enuu") Long enuu, @Param("operateUserType") Integer operateUserType, @Param("status") List<Integer> status);
 
 	/**
-	 * 获取当前卖家的已通过企业银行账户
+	 * 获取平台的账户数
 	 *
-	 * @param useruu 个人uu
 	 * @param enuu 企业enuu
-	 * @param num 序号
-	 * @param type 账户类型
-	 * @param opraterUserType 操作人的类型
-	 * @param status 状态
-	 * @return list
+	 * @param operateUserType 操作人的类型
+	 * @return
+	 */
+	@Query("select count(b) from BankInfo b where b.enuu=:enuu and b.opraterUserType=:operateUserType and b.status=:status")
+	int getMallCountByEnuuAndStatus(@Param("enuu") Long enuu, @Param("operateUserType") Integer operateUserType, @Param("status") Integer status);
+
+	/**
+	 * 根据银行账号查询个人账号下的账户个数
+	 * @param useruu
+	 * @param enuu
+	 * @param opraterUserType
+	 * @param status
+	 * @param number
+	 * @return
 	 */
-	List<BankInfo> findByUseruuAndEnuuAndNumAndTypeAndOpraterUserTypeAndStatus(Long useruu, Long enuu, Integer num, Short type, Integer opraterUserType, Integer status);
+	@Query("select count(b) from BankInfo b where b.useruu=:useruu and b.enuu=:enuu and b.opraterUserType=:opraterUserType and b.status=:status and b.number=:number")
+	int getBuyerCountByNumberAndEnuu(@Param("useruu") Long useruu, @Param("enuu") Long enuu, @Param("opraterUserType") Integer opraterUserType, @Param("status") Integer status, @Param("number") String number);
+
+	/**
+	 * 根据银行账号查询个人账号下的账户个数
+	 * @param useruu
+	 * @param dissociative
+	 * @param status
+	 * @param number
+	 * @return
+	 */
+	@Query("select count(b) from BankInfo b where b.useruu=:useruu and b.dissociative=:dissociative and b.opraterUserType=:opraterUserType and b.status=:status and b.number=:number")
+	int getBuyerCountByNumberAndDissociative(@Param("useruu") Long useruu, @Param("dissociative") Integer dissociative, @Param("opraterUserType") Integer opraterUserType,
+											 @Param("status") Integer status, @Param("number") String number);
+
+	/**
+	 * 银行账户返回企业账户数
+	 * @param enuu
+	 * @param opraterUserType
+	 * @param status
+	 * @param number
+	 * @return
+	 */
+	@Query("select count(b) from BankInfo b where b.enuu=:enuu and b.opraterUserType=:opraterUserType and b.status in :status and b.number=:number")
+	int getEnterpriseCountByNumberAndEnuu(@Param("enuu") Long enuu, @Param("opraterUserType") Integer opraterUserType,
+									 @Param("status") List<Integer> status, @Param("number") String number);
+
+	List<BankInfo> findByUseruuAndEnuuAndNumAndOpraterUserTypeAndStatus(Long useruu, Long enuu, Integer num, Integer opraterUserType, Integer status);
 }

+ 29 - 0
src/main/java/com/uas/platform/b2c/fa/payment/dao/InstallmentDao.java

@@ -0,0 +1,29 @@
+package com.uas.platform.b2c.fa.payment.dao;
+
+import com.uas.platform.b2c.fa.payment.model.Installment;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 分期支付dao
+ * @author wangyc
+ *
+ * @version 2017/9/7 9:10 wangyc
+ */
+@Repository
+public interface InstallmentDao extends JpaSpecificationExecutor<Installment>, JpaRepository<Installment, Long>{
+
+    /**
+     * 通过采购单id获取分期信息
+     * @param purchaseId
+     * @return
+     */
+    Installment findByPurchaseId(Long purchaseId);
+
+    /**
+     * 通过采购单id删除分期信息
+     * @param purchaseId
+     */
+    void deleteByPurchaseId(Long purchaseId);
+}

+ 36 - 0
src/main/java/com/uas/platform/b2c/fa/payment/dao/InstallmentDetailDao.java

@@ -0,0 +1,36 @@
+package com.uas.platform.b2c.fa.payment.dao;
+
+import com.uas.platform.b2c.fa.payment.model.InstallmentDetail;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 分期明细dao
+ * @author wangyc
+ *
+ * @version 2017/9/7 9:12 wangyc
+ */
+@Repository
+public interface InstallmentDetailDao extends JpaSpecificationExecutor<InstallmentDetail>, JpaRepository<InstallmentDetail, Long>{
+
+    /**
+     * 通过分期信息id和序号获取分期明细信息
+     * @param installmentId
+     * @param detno
+     * @return
+     */
+    InstallmentDetail findByInstallmentIdAndDetno(Long installmentId, Short detno);
+
+    /**
+     * 根据分期信息id和序号删除序号大于该序号的分期明细
+     * @param installmentId
+     * @param detno
+     */
+    @Modifying
+    @Query(value = "delete from trade$installment_detail where insd_installmentid =:installmentId and insd_detno >:detno", nativeQuery = true)
+    void deleteGtDetno(@Param("installmentId") Long installmentId, @Param("detno") Short detno);
+}

+ 32 - 0
src/main/java/com/uas/platform/b2c/fa/payment/dao/InstallmentStoreDao.java

@@ -0,0 +1,32 @@
+package com.uas.platform.b2c.fa.payment.dao;
+
+import com.uas.platform.b2c.fa.payment.model.InstallmentStore;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 分期店铺权限dao
+ * @author wangyc
+ *
+ * @version 2017/9/7 11:24 wangyc
+ */
+@Repository
+public interface InstallmentStoreDao extends JpaSpecificationExecutor<InstallmentStore>, JpaRepository<InstallmentStore, Long> {
+
+    /**
+     * 通过企业uu获取拥有分期权限店铺
+     *
+     * @param enuu 企业uu
+     * @param enable 是否启用
+     * @return
+     */
+    InstallmentStore findByEnuuAndEnable(Long enuu, Short enable);
+
+    /**
+     * 通过店铺uuid获取权限信息
+     * @param storeUuid
+     * @return
+     */
+    InstallmentStore findByStoreUuid(String storeUuid);
+}

+ 18 - 18
src/main/java/com/uas/platform/b2c/fa/payment/model/BankInfo.java

@@ -50,6 +50,12 @@ public class BankInfo implements Serializable{
 	 */
 	@Column(name = "binfo_name")
 	private String bankname;
+
+	/**
+	 * 开户支行名称
+	 */
+	@Column(name = "binfo_branch")
+	private String branchname;
 	
 	/**
 	 * 开户名
@@ -62,19 +68,13 @@ public class BankInfo implements Serializable{
 	 */
 	@Column(name = "binfo_number")
 	private String number;
-	
-	/**
-	 * 是个人账户还是企业账户
-	 * 1 个人账户,2 企业账户
-	 */
-	@Column(name = "binfo_type")
-	private Short type;
 
 	/**
 	 * 账户信息的状态
-	 * 101, "已提交"
+	 * 101, "已提交" --待审核
 	 * 103, "未通过"
-	 * 104, "已通过"
+	 * 104, "已通过" --使用中
+	 * 105, "已失效"
 	 * 这个状态暂时只针对企业的账户,因为企业账户需要审核,个人账户不需要审核
 	 */
 	@Column(name = "binfo_status")
@@ -135,14 +135,6 @@ public class BankInfo implements Serializable{
 		this.useruu = useruu;
 	}
 
-	public Short getType() {
-		return type;
-	}
-
-	public void setType(Short type) {
-		this.type = type;
-	}
-
 	public Long getEnuu() {
 		return enuu;
 	}
@@ -175,6 +167,14 @@ public class BankInfo implements Serializable{
 		this.accountname = accountname;
 	}
 
+	public String getBranchname() {
+		return branchname;
+	}
+
+	public void setBranchname(String branchname) {
+		this.branchname = branchname;
+	}
+
 	public String getNumber() {
 		return number;
 	}
@@ -248,7 +248,7 @@ public class BankInfo implements Serializable{
 	public String toString() {
 		return "BankInfo [id=" + id + ", useruu=" + useruu + ", enuu=" + enuu
 				+ ", num=" + num + ", bankname=" + bankname + ", accountname="
-				+ accountname + ", number=" + number + ", type=" + type
+				+ accountname + ", number=" + number
 				+ ", currency=" + currency + "]";
 	}
 }

+ 106 - 1
src/main/java/com/uas/platform/b2c/fa/payment/model/BankTransfer.java

@@ -1,6 +1,7 @@
 package com.uas.platform.b2c.fa.payment.model;
 
 import javax.persistence.*;
+import java.text.SimpleDateFormat;
 import java.util.Date;
 
 /**
@@ -13,6 +14,8 @@ import java.util.Date;
 @Table(name = "trade$bank_transfer")
 public class BankTransfer {
 
+	private final static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
 	@Id
 	@GeneratedValue
 	@Column(name = "banktf_id")
@@ -30,6 +33,24 @@ public class BankTransfer {
 	@Column(name = "banktf_sn", unique = true)
 	private String banktranssn;
 
+	/**
+	 * 转账类型(转账给卖家,转账给平台)
+	 */
+	@Column(name = "banktf_type")
+	private String type;
+
+	/**
+	 * 对应分期明细id
+	 */
+	@Column(name = "banktf_installdetailid")
+	private Long installmentDetailId;
+
+	/**
+	 * 对应分期金额数组
+	 */
+	@Transient
+	private String pricesArr;
+
 	/**
 	 * 状态 TOBEMADEOUTANINVOICE(512, "待开发票"), MADEOUTANINVOICE(513, "已开发票"),
 	 */
@@ -48,6 +69,30 @@ public class BankTransfer {
 	@Column(name = "banktf_collectuu")
 	private Long collectUseruu;
 
+	/**
+	 * 买家名称
+	 */
+	@Column(name = "banktf_buyername")
+	private String buyername;
+
+	/**
+	 * 买家企业名称
+	 */
+	@Column(name = "banktf_entername")
+	private String buyerentername;
+
+	/**
+	 * 订单号
+	 */
+	@Column(name = "banktf_orid")
+	private String orderid;
+
+	/**
+	 * 采购单号
+	 */
+	@Column(name = "bankty_puid")
+	private String puid;
+
 	/**
 	 * 付款方个人uu
 	 */
@@ -69,7 +114,7 @@ public class BankTransfer {
 	/**
 	 * 凭证图片
 	 */
-	@Column(name = "banktf_imgUrl", length = 2000)
+	@Column(name = "banktf_imgUrl", length = 4000)
 	private String imgUrl;
 
 	/**
@@ -127,6 +172,22 @@ public class BankTransfer {
 		this.jsonReceive = jsonReceive;
 	}
 
+	public String getOrderid() {
+		return orderid;
+	}
+
+	public void setOrderid(String orderid) {
+		this.orderid = orderid;
+	}
+
+	public String getPuid() {
+		return puid;
+	}
+
+	public void setPuid(String puid) {
+		this.puid = puid;
+	}
+
 	public String getJsonPament() {
 		return jsonPament;
 	}
@@ -151,6 +212,30 @@ public class BankTransfer {
 		this.banktranssn = banktranssn;
 	}
 
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public Long getInstallmentDetailId() {
+		return installmentDetailId;
+	}
+
+	public void setInstallmentDetailId(Long installmentDetailId) {
+		this.installmentDetailId = installmentDetailId;
+	}
+
+	public String getPricesArr() {
+		return pricesArr;
+	}
+
+	public void setPricesArr(String pricesArr) {
+		this.pricesArr = pricesArr;
+	}
+
 	public Long getCollectenuu() {
 		return collectenuu;
 	}
@@ -240,6 +325,22 @@ public class BankTransfer {
 		this.dissociative = dissociative;
 	}
 
+	public String getBuyername() {
+		return buyername;
+	}
+
+	public void setBuyername(String buyername) {
+		this.buyername = buyername;
+	}
+
+	public String getBuyerentername() {
+		return buyerentername;
+	}
+
+	public void setBuyerentername(String buyerentername) {
+		this.buyerentername = buyerentername;
+	}
+
 	public BankTransAssociate getBankTransAssociate() {
 		return bankTransAssociate;
 	}
@@ -248,4 +349,8 @@ public class BankTransfer {
 		this.bankTransAssociate = bankTransAssociate;
 		return this;
 	}
+
+	public String convertTime(){
+		return sdf.format(transferTime);
+	}
 }

+ 156 - 0
src/main/java/com/uas/platform/b2c/fa/payment/model/Installment.java

@@ -0,0 +1,156 @@
+package com.uas.platform.b2c.fa.payment.model;
+
+import javax.persistence.*;
+import java.util.Set;
+
+/**
+ * 分期信息
+ * @author wangyc
+ *
+ * @version 2017/9/6 16:09 wangyc
+ */
+@Entity
+@Table(name = "trade$installment")
+public class Installment {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    @Column(name = "ins_id")
+    private Long id;
+
+    /**
+     * 订单号
+     */
+    @Column(name = "ins_ordernum")
+    private String orderNum;
+
+    /**
+     * 订单id
+     */
+    @Column(name = "ins_orderid")
+    private Long orderId;
+
+    /**
+     * 采购单id
+     */
+    @Column(name = "insss_purchaseid")
+    private Long purchaseId;
+
+    /**
+     * 卖家企业uu
+     */
+    @Column(name = "ins_sellerenuu")
+    private Long sellerenuu;
+
+    /**
+     * 订单总金额
+     */
+    @Column(name = "ins_price")
+    private Double price;
+
+    /**
+     * 状态
+     * TOBEPAID(503, "待付款"),PAID(504, "已付款"),MONEYRECEIVED(505, "已收款")
+     */
+    @Column(name = "ins_status")
+    private Integer status;
+
+    /**
+     * 当前期数
+     */
+    @Column(name = "ins_currentno")
+    private Short currentNo;
+
+    /**
+     * 总期数
+     */
+    @Column(name = "ins_count")
+    private Integer count;
+
+    /**
+     * 分期明细
+     */
+    @OneToMany(mappedBy = "installment", cascade = { CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REMOVE }, fetch = FetchType.EAGER, orphanRemoval = true)
+    @OrderBy("detno")
+    private Set<InstallmentDetail> installmentDetails;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(String orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public Long getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Long orderId) {
+        this.orderId = orderId;
+    }
+
+    public Long getPurchaseId() {
+        return purchaseId;
+    }
+
+    public void setPurchaseId(Long purchaseId) {
+        this.purchaseId = purchaseId;
+    }
+
+    public Long getSellerenuu() {
+        return sellerenuu;
+    }
+
+    public void setSellerenuu(Long sellerenuu) {
+        this.sellerenuu = sellerenuu;
+    }
+
+    public Double getPrice() {
+        return price;
+    }
+
+    public void setPrice(Double price) {
+        this.price = price;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Short getCurrentNo() {
+        return currentNo;
+    }
+
+    public void setCurrentNo(Short currentNo) {
+        this.currentNo = currentNo;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+
+    public Set<InstallmentDetail> getInstallmentDetails() {
+        return installmentDetails;
+    }
+
+    public void setInstallmentDetails(Set<InstallmentDetail> installmentDetails) {
+        this.installmentDetails = installmentDetails;
+    }
+}

+ 175 - 0
src/main/java/com/uas/platform/b2c/fa/payment/model/InstallmentDetail.java

@@ -0,0 +1,175 @@
+package com.uas.platform.b2c.fa.payment.model;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import org.codehaus.jackson.annotate.JsonIgnore;
+
+import javax.persistence.*;
+import java.util.Date;
+
+/**
+ * 分期信息明细
+ * @author wangyc
+ *
+ * @version 2017/9/6 16:22 wangyc
+ */
+@Entity
+@Table(name = "trade$installment_detail")
+public class InstallmentDetail {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    @Column(name = "insd_id")
+    private Long id;
+
+    /**
+     * 分期信息id
+     */
+    @Column(name = "insd_installmentid")
+    private Long installmentId;
+
+    /**
+     * 分期信息
+     */
+    @ManyToOne(cascade = {CascadeType.REFRESH})
+    @JoinColumn(name = "insd_installmentid", insertable = false, updatable = false)
+    private Installment installment;
+
+    /**
+     * 本期金额
+     */
+    @Column(name = "insd_price")
+    private Double price;
+
+    /**
+     * 第几期
+     */
+    @Column(name = "insd_detno")
+    private Short detno;
+
+    /**
+     * 本期状态
+     * TOBEPAID(503, "待付款"),PAID(504, "已付款"),MONEYRECEIVED(505, "已收款")
+     */
+    @Column(name = "insd_status")
+    private Integer status;
+
+    /**
+     * 本期截止日期
+     */
+    @Column(name = "insd_deadline")
+    private Date deadline;
+
+    /**
+     * 买家付款日期
+     */
+    @Column(name = "insd_paiddate")
+    private Date paidDate;
+
+    /**
+     * 卖家确认收款日期
+     */
+    @Column(name = "insd_ensuredate")
+    private Date ensureDate;
+
+    /**
+     * 上传水单图片,以“,”拼接,最多6张
+     */
+    @Column(name = "insd_imgs", length = 4000)
+    private String imgs;
+
+    /**
+     * 上传水单金额,以“,”拼接,最多6个
+     */
+    @Column(name = "insd_pricesarr", length = 4000)
+    private String pricesArr;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getInstallmentId() {
+        return installmentId;
+    }
+
+    public void setInstallmentId(Long installmentId) {
+        this.installmentId = installmentId;
+    }
+
+    @JsonIgnore
+    @JSONField(serialize = false)
+    public Installment getInstallment() {
+        return installment;
+    }
+
+    public void setInstallment(Installment installment) {
+        this.installment = installment;
+    }
+
+    public Double getPrice() {
+        return price;
+    }
+
+    public void setPrice(Double price) {
+        this.price = price;
+    }
+
+    public Short getDetno() {
+        return detno;
+    }
+
+    public void setDetno(Short detno) {
+        this.detno = detno;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Date getDeadline() {
+        return deadline;
+    }
+
+    public void setDeadline(Date deadline) {
+        this.deadline = deadline;
+    }
+
+    public Date getPaidDate() {
+        return paidDate;
+    }
+
+    public void setPaidDate(Date paidDate) {
+        this.paidDate = paidDate;
+    }
+
+    public Date getEnsureDate() {
+        return ensureDate;
+    }
+
+    public void setEnsureDate(Date ensureDate) {
+        this.ensureDate = ensureDate;
+    }
+
+    public String getImgs() {
+        return imgs;
+    }
+
+    public void setImgs(String imgs) {
+        this.imgs = imgs;
+    }
+
+    public String getPricesArr() {
+        return pricesArr;
+    }
+
+    public void setPricesArr(String pricesArr) {
+        this.pricesArr = pricesArr;
+    }
+}

+ 116 - 0
src/main/java/com/uas/platform/b2c/fa/payment/model/InstallmentStore.java

@@ -0,0 +1,116 @@
+package com.uas.platform.b2c.fa.payment.model;
+
+import com.uas.platform.b2c.common.account.model.Enterprise;
+import com.uas.platform.b2c.prod.store.model.StoreIn;
+
+import javax.persistence.*;
+
+/**
+ * 分期权限店铺
+ * @author wangyc
+ *
+ * @version 2017/9/7 11:12 wangyc
+ */
+@Entity
+@Table(name = "trade$installment_store")
+public class InstallmentStore {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    @Column(name = "inss_id")
+    private Long id;
+
+    /**
+     * 店铺uuid
+     */
+    @Column(name = "inss_storeuuid")
+    private String storeUuid;
+
+    /**
+     * 店铺id
+     */
+    @Column(name = "inss_storeid")
+    private Long storeId;
+
+    /**
+     * 店铺信息
+     */
+    @OneToOne(cascade = CascadeType.REFRESH, fetch = FetchType.LAZY)
+    @JoinColumn(name = "inss_storeid", insertable = false, updatable = false)
+    private StoreIn store;
+
+    /**
+     * 企业uu
+     */
+    @Column(name = "inss_enuu")
+    private Long enuu;
+
+    /**
+     * 企业信息
+     */
+    @OneToOne(cascade = CascadeType.REFRESH, fetch = FetchType.LAZY)
+    @JoinColumn(name = "inss_enuu", insertable = false, updatable = false)
+    private Enterprise enterprise;
+
+    /**
+     * 是否启用 启用:1,禁用:0
+     */
+    @Column(name = "inss_enable")
+    private Short enable;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getStoreUuid() {
+        return storeUuid;
+    }
+
+    public void setStoreUuid(String storeUuid) {
+        this.storeUuid = storeUuid;
+    }
+
+    public Long getStoreId() {
+        return storeId;
+    }
+
+    public void setStoreId(Long storeId) {
+        this.storeId = storeId;
+    }
+
+    public StoreIn getStore() {
+        return store;
+    }
+
+    public void setStore(StoreIn store) {
+        this.store = store;
+    }
+
+    public Long getEnuu() {
+        return enuu;
+    }
+
+    public void setEnuu(Long enuu) {
+        this.enuu = enuu;
+    }
+
+    public Enterprise getEnterprise() {
+        return enterprise;
+    }
+
+    public void setEnterprise(Enterprise enterprise) {
+        this.enterprise = enterprise;
+    }
+
+    public Short getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Short enable) {
+        this.enable = enable;
+    }
+}

+ 21 - 4
src/main/java/com/uas/platform/b2c/fa/payment/service/BankInfoService.java

@@ -20,12 +20,11 @@ public interface BankInfoService {
 	 * 保存账户的信息
 	 *
 	 * @param bankInfo 需要保存的信息
-	 * @param personal 是否是个人,还是企业
 	 * @param type     [buyer, mall, sup]
 	 * @param fileItem the file item
 	 * @return BankInfo
 	 */
-	BankInfo save(BankInfo bankInfo, boolean personal, Integer type, FileUpload... fileItem);
+	BankInfo save(BankInfo bankInfo, Integer type, FileUpload... fileItem);
 
 
 	/**
@@ -46,12 +45,12 @@ public interface BankInfoService {
 	void delete(Long id);
 
 	/**
-	 * 根据操作人类型查找所有的账户信息
+	 * 分页获取买家账户信息
 	 *
 	 * @param operatorUserType 操作人类型
 	 * @return list
 	 */
-	List<BankInfo> getPersonBankInfo(Integer operatorUserType);
+	Page<BankInfo> getPersonBankInfo(PageParams params, Integer operatorUserType);
 
 	/**
 	 * 根据以下参数 获取对应的参数
@@ -72,6 +71,15 @@ public interface BankInfoService {
 	 */
 	List<BankInfo> getEnterpriseBankInfo(Integer operatorUserType, Long... params);
 
+	/**
+	 * 分页获取卖家的账户信息
+	 *
+	 * @param params
+	 * @param operatorUserType
+	 * @return
+	 */
+	Page<BankInfo> getSupBankInfo(PageParams params, Integer operatorUserType);
+
 	/**
 	 * 根据以下参数 获取对应的参数查找所有的账户信息
 	 *
@@ -131,4 +139,13 @@ public interface BankInfoService {
 	 * @return ResultMap
 	 */
 	ResultMap auditBankInfo(Long id, Integer status, String... str);
+
+	/**
+	 * 根据银行账号返回账户数
+	 *
+	 * @param type
+	 * @param number
+	 * @return
+	 */
+	ResultMap getCountByNumber(Integer type, String number);
 }

+ 12 - 1
src/main/java/com/uas/platform/b2c/fa/payment/service/BankTransferService.java

@@ -8,6 +8,7 @@ import com.uas.platform.core.model.PageParams;
 import org.springframework.data.domain.Page;
 
 import java.util.List;
+import java.util.Random;
 
 /**
  * The interface BankTransfer service.
@@ -149,5 +150,15 @@ public interface BankTransferService {
 	 * @param type   the type 指定类型
 	 * @return ResultMap
 	 */
-	ResultMap getVendorBankTransferByMall(PageParams params, Integer type);
+	ResultMap getVendorBankTransferByMall(PageParams params, Integer type, String keyword, Long fromDate, Long toDate);
+
+	/**
+	 * 导出excel数据
+	 * @param type
+	 * @param keyword
+	 * @param fromDate
+	 * @param toDate
+	 * @return
+	 */
+	List<BankTransfer> getExportData(Integer type, String keyword, Long fromDate, Long toDate);
 }

+ 57 - 0
src/main/java/com/uas/platform/b2c/fa/payment/service/InstallmentService.java

@@ -0,0 +1,57 @@
+package com.uas.platform.b2c.fa.payment.service;
+
+import com.uas.platform.b2c.fa.payment.model.BankTransfer;
+import com.uas.platform.b2c.fa.payment.model.Installment;
+
+/**
+ * 分期支付service
+ * @author wangyc
+ *
+ * @version 2017/9/7 9:07 wangyc
+ */
+public interface InstallmentService {
+
+    /**
+     * 新增分期信息
+     * @param installment 分期信息
+     * @param purchaseId 采购单id
+     * @return
+     */
+    Installment createInstallment(Installment installment, Long purchaseId);
+
+    /**
+     * 更新分期信息
+     * @param installment 分期信息
+     * @param purchaseId 采购单id
+     * @return
+     */
+    Installment updateInstallment(Installment installment, Long purchaseId);
+
+    /**
+     * 支付单一分期
+     * @param bankTransfer 转账信息
+     * @param orderId 订单id
+     * @return
+     */
+    Installment paidInstallment(BankTransfer bankTransfer, Long orderId);
+
+    /**
+     * 删除分期信息
+     * @param purchaseId
+     */
+    void deleteInstallment(Long purchaseId);
+
+    /**
+     * 验证卖家是否能够设置分期信息
+     * @param purchaseId
+     * @return
+     */
+    String validationEnableInstallment(Long purchaseId);
+
+    /**
+     * 采购单改价后更新分期信息
+     * @param purchaseDetailId
+     * @return
+     */
+    Installment updateAfterModifyPurchasePrice(String purchaseDetailId);
+}

+ 46 - 0
src/main/java/com/uas/platform/b2c/fa/payment/service/InstallmentStoreService.java

@@ -0,0 +1,46 @@
+package com.uas.platform.b2c.fa.payment.service;
+
+import com.uas.platform.b2c.fa.payment.model.InstallmentStore;
+
+/**
+ * 分期权限店铺service
+ * @author wangyc
+ *
+ * @version 2017/9/7 11:22 wangyc
+ */
+public interface InstallmentStoreService {
+
+    /**
+     * 分期权限店铺的保存功能
+     *
+     * @param storeUuid 店铺uuid
+     */
+    InstallmentStore saveStore(String storeUuid);
+
+    /**
+     * 分期权限店铺的删除功能
+     *
+     * @param storeUuid 店铺uuid
+     */
+    void deleteStore(String storeUuid);
+
+    /**
+     * 分期权限店铺的禁用功能
+     *
+     * @param storeUuid 店铺uuid
+     */
+    InstallmentStore capsOFF(String storeUuid);
+
+    /**
+     * 分期权限店铺的启用功能
+     *
+     * @param storeUuid 店铺uuid
+     */
+    InstallmentStore capsON(String storeUuid);
+
+    /**
+     * 验证分期权限店铺的是否开启功能
+     */
+    String capsOFFVerify();
+
+}

+ 138 - 68
src/main/java/com/uas/platform/b2c/fa/payment/service/impl/BankInfoServiceImpl.java

@@ -1,21 +1,22 @@
 package com.uas.platform.b2c.fa.payment.service.impl;
 
+import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.common.base.model.FileUpload;
 import com.uas.platform.b2c.common.base.service.FileService;
 import com.uas.platform.b2c.core.config.SysConf;
+import com.uas.platform.b2c.core.constant.Status;
+import com.uas.platform.b2c.core.constant.Type;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.fa.payment.dao.BankInfoDao;
 import com.uas.platform.b2c.fa.payment.model.BankInfo;
 import com.uas.platform.b2c.fa.payment.service.BankInfoService;
 import com.uas.platform.b2c.trade.support.CodeType;
 import com.uas.platform.b2c.trade.support.ResultMap;
-import com.uas.platform.core.exception.IllegalOperatorException;
 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.model.Type;
 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 org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -29,6 +30,8 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 
@@ -48,27 +51,28 @@ public class BankInfoServiceImpl implements BankInfoService {
 	@Autowired
 	SysConf sysConf;
 
+	private final static List<Integer> statusList = Arrays.asList(Status.SUBMITTED.value(), Status.NOTALLOW.value(), Status.ALLOW.value(), Status.EXPIRED.value());
+
 	/**
-	 * 保存账户的信息
+	 * 已修改,保存账户的信息
 	 * @param bankInfo 需要保存的信息
-	 * @param personal 是否是个人,还是企业
 	 * @param type [buyer, mall, sup]
 	 * @return
 	 */
 	@Override
 	@Transactional
-	public BankInfo save(BankInfo bankInfo, boolean personal, Integer type, FileUpload... fileItem) {
+	public BankInfo save(BankInfo bankInfo, Integer type, FileUpload... fileItem) {
 		bankInfo.setOpraterUserType(type);
 		bankInfo.setCreateTime(new Date());
 		if(type == Type.BUYER.value()) {
-			if (personal) {
-				bankInfo.setType((short)1);
-			} else {
-				bankInfo.setType((short)2);
-			}
 			if(bankInfo.getId() == null) {
-				bankInfo.setNum(SystemSession.getUser().getEnterprise() != null ?
-						bankInfoDao.getKindCountByUseruuAndStatus(SystemSession.getUser().getUserUU(), SystemSession.getUser().getEnterprise().getUu(), bankInfo.getType(), bankInfo.getOpraterUserType(), Status.ALLOW.value()) + 1 : bankInfoDao.getKindCountByUseruuAndStatusAndDissociative(SystemSession.getUser().getUserUU(), Type.PERSONAL.value(), bankInfo.getType(), bankInfo.getOpraterUserType(), Status.ALLOW.value()) + 1);
+				if (SystemSession.getUser().getEnterprise() != null){
+					int num = bankInfoDao.getCountByUseruuAndStatus(SystemSession.getUser().getUserUU(), SystemSession.getUser().getEnterprise().getUu(), bankInfo.getOpraterUserType(), Status.ALLOW.value()) + 1;
+					bankInfo.setNum(num);
+				}else {
+					int num = bankInfoDao.getCountByUseruuAndStatusAndDissociative(SystemSession.getUser().getUserUU(), Type.PERSONAL.value(), bankInfo.getOpraterUserType(), Status.ALLOW.value()) + 1;
+					bankInfo.setNum(num);
+				}
 			}
 			bankInfo.setUseruu(SystemSession.getUser().getUserUU());
 			bankInfo.setEnuu(SystemSession.getUser().getEnterprise() != null ? SystemSession.getUser().getEnterprise().getUu() : null);
@@ -80,14 +84,10 @@ public class BankInfoServiceImpl implements BankInfoService {
 			bankInfo.setStatus(Status.ALLOW.value());
 		}else if(type == Type.SUP.value()) {
 			bankInfo.setEnuu(SystemSession.getUser().getEnterprise().getUu());
-			bankInfo.setType((short)2);
+			bankInfo.setDissociative(Type.ENTERPRISING.value());
 			if(bankInfo.getId() == null) {
-				int count = bankInfoDao.getKindCountByEnuuAndStatus(SystemSession.getUser().getEnterprise().getUu(), bankInfo.getType(), bankInfo.getOpraterUserType(), Status.ALLOW.value());
-				if(count > 0) {
-					throw new IllegalOperatorException("供应商企业账户只能保存一条,请删除之后重新操作");
-				}
-				int num = bankInfoDao.getKindCountByEnuuAndStatus(SystemSession.getUser().getEnterprise().getUu(), bankInfo.getType(), bankInfo.getOpraterUserType(), Status.SUBMITTED.value());
-				bankInfo.setNum(num + 1);
+				int count = bankInfoDao.getCountByEnuuAndStatus(SystemSession.getUser().getEnterprise().getUu(), bankInfo.getOpraterUserType(), statusList);
+				bankInfo.setNum(count + 1);
 			}
 			bankInfo.setStatus(Status.SUBMITTED.value());
 		}
@@ -100,6 +100,10 @@ public class BankInfoServiceImpl implements BankInfoService {
 		return bankInfoDao.save(bankInfo);
 	}
 
+	/**
+	 * 已修改,删除账户信息,取出对应账户信息排序
+	 * @param id the id
+	 */
 	@Override
 	@Transactional
 	public void delete(Long id) {
@@ -109,15 +113,20 @@ public class BankInfoServiceImpl implements BankInfoService {
 			baInfo.setStatus(Status.DELETED.value());
 			bankInfoDao.save(baInfo);
 			int i = 1;
-			if (baInfo.getType() == 2) {
-				List<BankInfo> list = bankInfoDao.findByEnuuAndTypeAndStatusAndOpraterUserTypeOrderByNumAsc(baInfo.getEnuu(), (short)2, Status.ALLOW.value(), baInfo.getOpraterUserType());
+			if (baInfo.getOpraterUserType() == Type.BUYER.value()){
+				List<BankInfo> list = new ArrayList<>();
+				if (baInfo.getEnuu() != null){
+					list = bankInfoDao.findByUseruuAndEnuuAndOpraterUserTypeAndStatusOrderByNumAsc(baInfo.getUseruu(), baInfo.getEnuu(), baInfo.getOpraterUserType(), Status.ALLOW.value());
+				}else {
+					list = bankInfoDao.findByUseruuAndDissociativeAndOpraterUserTypeAndStatusOrderByNumAsc(baInfo.getUseruu(), Type.PERSONAL.value(), baInfo.getOpraterUserType(), Status.ALLOW.value());
+				}
 				for (BankInfo bankInfo : list) {
 					bankInfo.setNum(i);
 					i++;
 				}
 				bankInfoDao.save(list);
-			} else {
-				List<BankInfo> list = bankInfoDao.findByUseruuAndEnuuAndTypeAndOpraterUserTypeAndStatusOrderByNumAsc(baInfo.getUseruu(), baInfo.getEnuu(), (short)1, baInfo.getOpraterUserType(), Status.ALLOW.value());
+			} else if (baInfo.getOpraterUserType() == Type.SUP.value()){
+				List<BankInfo> list = bankInfoDao.findSupBankList(baInfo.getEnuu(), baInfo.getOpraterUserType(), statusList);
 				for (BankInfo bankInfo : list) {
 					bankInfo.setNum(i);
 					i++;
@@ -127,14 +136,58 @@ public class BankInfoServiceImpl implements BankInfoService {
 		}
 	}
 
+	/**
+	 * 已修改,分页获取买家账户信息
+	 * @param params
+	 * @param operatorUserType 操作人类型
+	 * @return
+	 */
 	@Override
-	public List<BankInfo> getPersonBankInfo(Integer operatorUserType) {
-		if (SystemSession.getUser().getEnterprise() != null) {
-			return bankInfoDao.findByUseruuAndEnuuAndTypeAndOpraterUserTypeAndStatusOrderByNumAsc(SystemSession.getUser().getUserUU(), SystemSession.getUser().getEnterprise().getUu(), (short)1, operatorUserType, Status.ALLOW.value());
-		} else {
-			return bankInfoDao.findByUseruuAndDissociativeAndTypeAndOpraterUserTypeAndStatusOrderByNumAsc(SystemSession.getUser().getUserUU(), Type.PERSONAL.value(), (short)1, operatorUserType, Status.ALLOW.value());
+	public Page<BankInfo> getPersonBankInfo(PageParams params, Integer operatorUserType) {
+		final PageInfo pageInfo = new PageInfo(params);
+		pageInfo.filter("opraterUserType", operatorUserType);
+		pageInfo.filter("useruu", SystemSession.getUser().getUserUU());
+		if (SystemSession.getUser().getEnterprise() != null){
+			pageInfo.filter("enuu", SystemSession.getUser().getEnterprise().getUu());
+		}else {
+			pageInfo.filter("dissociative", Type.PERSONAL.value());
 		}
+		pageInfo.filter("status", Status.ALLOW.value());
+		return bankInfoDao.findAll(new Specification<BankInfo>() {
+			@Override
+			public Predicate toPredicate(Root<BankInfo> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
+				query.where(pageInfo.getPredicates(root, query, cb));
+				return null;
+			}
+		}, pageInfo);
+	}
 
+	/**
+	 * 已修改,分页获取卖家账户信息
+	 *
+	 * @param params
+	 * @param operatorUserType
+	 * @return
+	 */
+	@Override
+	public Page<BankInfo> getSupBankInfo(PageParams params, Integer operatorUserType) {
+		final PageInfo pageInfo = new PageInfo(params);
+		pageInfo.filter("opraterUserType", operatorUserType);
+		pageInfo.filter("enuu", SystemSession.getUser().getEnterprise().getUu());
+		SimpleExpression expression1 = new SimpleExpression("status", Status.SUBMITTED.value(), CriterionExpression.Operator.EQ);
+		SimpleExpression expression2 = new SimpleExpression("status", Status.NOTALLOW.value(), CriterionExpression.Operator.EQ);
+		SimpleExpression expression3 = new SimpleExpression("status", Status.ALLOW.value(), CriterionExpression.Operator.EQ);
+		SimpleExpression expression4 = new SimpleExpression("status", Status.EXPIRED.value(), CriterionExpression.Operator.EQ);
+		SimpleExpression[] expressions = new SimpleExpression[]{expression1, expression2, expression3, expression4};
+		pageInfo.expression(PredicateUtils.or(expressions));
+
+		return bankInfoDao.findAll(new Specification<BankInfo>() {
+			@Override
+			public Predicate toPredicate(Root<BankInfo> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
+				query.where(pageInfo.getPredicates(root, query, cb));
+				return null;
+			}
+		}, pageInfo);
 	}
 
 	@Override
@@ -147,14 +200,13 @@ public class BankInfoServiceImpl implements BankInfoService {
 		}
 		if(operatorUserType == Type.BUYER.value()) {
 			if (enuu != null) {
-				return bankInfoDao.findByUseruuAndEnuuAndTypeAndOpraterUserTypeAndStatusOrderByNumAsc(SystemSession.getUser().getUserUU(), enuu, (short)2, operatorUserType, status);
+				return bankInfoDao.findByUseruuAndEnuuAndOpraterUserTypeAndStatusOrderByNumAsc(SystemSession.getUser().getUserUU(), enuu, operatorUserType, status);
 			} else {
-				return bankInfoDao.findByUseruuAndDissociativeAndTypeAndOpraterUserTypeAndStatusOrderByNumAsc(SystemSession.getUser().getUserUU(), Type.PERSONAL.value(), (short)2, operatorUserType, status);
+				return bankInfoDao.findByUseruuAndDissociativeAndOpraterUserTypeAndStatusOrderByNumAsc(SystemSession.getUser().getUserUU(), Type.PERSONAL.value(), operatorUserType, status);
 			}
 		}else {
-			return bankInfoDao.findByEnuuAndTypeAndStatusAndOpraterUserTypeOrderByNumAsc(enuu, (short)2, status, operatorUserType);
+			return bankInfoDao.findByEnuuAndStatusAndOpraterUserTypeOrderByNumAsc(enuu, status, operatorUserType);
 		}
-
 	}
 
 	@Override
@@ -164,7 +216,7 @@ public class BankInfoServiceImpl implements BankInfoService {
 
 	@Override
 	public List<BankInfo> findBankInfoByUseruu(Long useruu, Long enuu, Integer opraterUserType) {
-		return bankInfoDao.findByUseruuAndEnuuAndTypeAndOpraterUserTypeAndStatusOrderByNumAsc(useruu, enuu, (short)1, opraterUserType, Status.ALLOW.value());
+		return bankInfoDao.findByUseruuAndEnuuAndOpraterUserTypeAndStatusOrderByNumAsc(useruu, enuu, opraterUserType, Status.ALLOW.value());
 	}
 
 	@Override
@@ -179,19 +231,7 @@ public class BankInfoServiceImpl implements BankInfoService {
 		bankInfo.setOpraterUserType(Type.MALL.value());
 		bankInfo.setEnuu(sysConf.getEnUU());
 		bankInfo.setCreateTime(new Date());
-		if(isPersonal) {
-			bankInfo.setUseruu(sysConf.getAdminUU());
-			bankInfo.setType((short)1);
-		}else {
-			bankInfo.setType((short)2);
-		}
-		if(bankInfo.getType() == 2) {
-			size = bankInfoDao.getKindCountByEnuuAndStatus(bankInfo.getEnuu(), (short)2, Type.MALL.value(), Status.ALLOW.value());
-		}else if(bankInfo.getType() == 1) {
-			size = bankInfoDao.getKindCountByUseruuAndStatus(bankInfo.getUseruu(), bankInfo.getEnuu(), (short)1, Type.MALL.value(), Status.ALLOW.value());
-		}else {
-			new IllegalOperatorException("没有给账户设置对应的类型");
-		}
+		size = bankInfoDao.getMallCountByEnuuAndStatus(bankInfo.getEnuu(),Type.MALL.value(), Status.ALLOW.value());
 		bankInfo.setNum(++size);
 		bankInfo.setStatus(Status.ALLOW.value());
 		return bankInfoDao.save(bankInfo);
@@ -205,22 +245,21 @@ public class BankInfoServiceImpl implements BankInfoService {
 	@Transactional
 	@Override
 	public void setDefaultAccount(Long id) {
-		BankInfo account = bankInfoDao.findOne(id);
+		BankInfo baInfo = bankInfoDao.findOne(id);
 		List<BankInfo> bankInfos = null;
-		if(account.getOpraterUserType() == Type.BUYER.value()) {
-			bankInfos = bankInfoDao.findByUseruuAndEnuuAndTypeAndOpraterUserTypeAndStatusOrderByNumAsc(account.getUseruu(), account.getEnuu(), account.getType(), account.getOpraterUserType(), account.getStatus());
-		}else if(account.getOpraterUserType() == Type.SUP.value()){
-			bankInfos = bankInfoDao.findByEnuuAndTypeAndStatusAndOpraterUserTypeOrderByNumAsc(account.getEnuu(), account.getType(), account.getStatus(), account.getOpraterUserType());
-		}else if(account.getOpraterUserType() == Type.MALL.value()) {
-			if(account.getType() == 2) {
-				bankInfos = bankInfoDao.findByEnuuAndTypeAndStatusAndOpraterUserTypeOrderByNumAsc(account.getEnuu(), account.getType(), account.getStatus(), account.getOpraterUserType());
-			} else {
-				if(account.getType() == 1) {
-					bankInfos =	bankInfoDao.findByUseruuAndEnuuAndTypeAndOpraterUserTypeAndStatusOrderByNumAsc(account.getUseruu(), account.getEnuu(), account.getType(), account.getOpraterUserType(),account.getStatus());
-				}
+		if (baInfo.getOpraterUserType() == Type.BUYER.value()){
+			//只有买家账户才涉及到默认账户
+			bankInfos = bankInfoDao.findByUseruuAndEnuuAndOpraterUserTypeAndStatusOrderByNumAsc(baInfo.getUseruu(), baInfo.getEnuu(), baInfo.getOpraterUserType(), Status.ALLOW.value());
+		}else if (baInfo.getOpraterUserType() == Type.SUP.value()){
+			//卖家账户重新使用
+			bankInfos = bankInfoDao.findSupBankList(baInfo.getEnuu(), baInfo.getOpraterUserType(), statusList);
+			BankInfo firstItem = bankInfos.get(0);
+			if (firstItem.getStatus() == Status.ALLOW.value()){
+				firstItem.setStatus(Status.EXPIRED.value());
 			}
+			baInfo.setStatus(Status.ALLOW.value());
+			bankInfoDao.save(baInfo);
 		}
-
 		setDefaultAccountAssist(bankInfos, id);
 	}
 	
@@ -254,7 +293,7 @@ public class BankInfoServiceImpl implements BankInfoService {
 		}else {
 			enuu = params[0];
 		}
-		return bankInfoDao.findByEnuuAndTypeAndOpraterUserTypeOrderByNumAsc(enuu, (short)2, operatorUserType);
+		return bankInfoDao.findByEnuuAndOpraterUserTypeOrderByNumAsc(enuu, operatorUserType);
 	}
 
 	/**
@@ -308,17 +347,24 @@ public class BankInfoServiceImpl implements BankInfoService {
 			return new ResultMap(CodeType.NOT_EXiST, "操作的实体不存在");
 		}
 		if(bankInfo.getStatus() != Status.SUBMITTED.value()) {
-			return new ResultMap(CodeType.NOT_PERMIT, "该账户信息不是已交状态,不能审核");
+			return new ResultMap(CodeType.NOT_PERMIT, "该账户信息不是已交状态,不能审核");
 		}
 		if(status == Status.ALLOW.value()) { //审核通过
-			if(bankInfo.getOpraterUserType().intValue() == Type.SUP.value()) {
-				int num = bankInfoDao.getKindCountByEnuuAndStatus(bankInfo.getEnuu(), bankInfo.getType(), Type.SUP.value(), Status.ALLOW.value());
-				if(num > 0) {
-					return new ResultMap(CodeType.NOT_PERMIT, "该公司的银行账户已经存在了,不能再增加了");
-				}
-				bankInfo.setNum(1);
+			if(bankInfo.getOpraterUserType() == Type.SUP.value()) {
 				bankInfo.setStatus(Status.ALLOW.value());
 				bankInfo = bankInfoDao.save(bankInfo);
+				//获取所有的账户信息
+				List<BankInfo> infoList = bankInfoDao.findSupBankList(bankInfo.getEnuu(), bankInfo.getOpraterUserType(), statusList);
+				if (!CollectionUtils.isEmpty(infoList) && infoList.size() > 1){
+					BankInfo first = infoList.get(0); //获取第一个账户信息
+					if (first.getStatus() == Status.ALLOW.value()){
+						//已有使用中的账户
+						first.setStatus(Status.EXPIRED.value());
+						setDefaultAccountAssist(infoList, bankInfo.getId());
+					}else {
+						setDefaultAccountAssist(infoList, bankInfo.getId());
+					}
+				}
 			}
 		}else if(status == Status.NOTALLOW.value()){
 			if(str == null || str.length == 0) {
@@ -330,4 +376,28 @@ public class BankInfoServiceImpl implements BankInfoService {
 		}
 		return ResultMap.success(bankInfo);
 	}
+
+	@Override
+	public ResultMap getCountByNumber(Integer type, String number) {
+		if (type != Type.MALL.value() && type != Type.BUYER.value() && type != Type.SUP.value()){
+			return new ResultMap(CodeType.ERROR_STATE, "类型不存在,确认要查找账户的类型");
+		}
+		if (StringUtils.isEmpty(number)){
+			return new ResultMap(CodeType.NO_INFO, "银行账号丢失或为空,请确认银行账号");
+		}
+		Integer count = null;
+		if (type == Type.BUYER.value()){
+			Enterprise enterprise = SystemSession.getUser().getEnterprise();
+			if (enterprise != null){
+				count = bankInfoDao.getBuyerCountByNumberAndEnuu(SystemSession.getUser().getUserUU(), enterprise.getUu(),
+						Type.BUYER.value(), Status.ALLOW.value(), number);
+			}else {
+				count = bankInfoDao.getBuyerCountByNumberAndDissociative(SystemSession.getUser().getUserUU(), Type.PERSONAL.value(),
+						Type.BUYER.value(), Status.ALLOW.value(), number);
+			}
+		}else {
+			count = bankInfoDao.getEnterpriseCountByNumberAndEnuu(SystemSession.getUser().getEnterprise().getUu(), type, statusList, number);
+		}
+		return ResultMap.success(count);
+	}
 }

+ 166 - 29
src/main/java/com/uas/platform/b2c/fa/payment/service/impl/BankTransferServiceImpl.java

@@ -1,8 +1,11 @@
 package com.uas.platform.b2c.fa.payment.service.impl;
 
+import com.uas.platform.b2c.common.account.dao.EnterpriseDao;
+import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.core.config.SysConf;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
+import com.uas.platform.b2c.core.utils.NumberUtil;
 import com.uas.platform.b2c.fa.payment.dao.BankInfoDao;
 import com.uas.platform.b2c.fa.payment.dao.BankTransAssociateDao;
 import com.uas.platform.b2c.fa.payment.dao.BankTransferDao;
@@ -11,6 +14,7 @@ import com.uas.platform.b2c.fa.payment.model.BankTransAssociate;
 import com.uas.platform.b2c.fa.payment.model.BankTransfer;
 import com.uas.platform.b2c.fa.payment.service.BankInfoService;
 import com.uas.platform.b2c.fa.payment.service.BankTransferService;
+import com.uas.platform.b2c.fa.payment.service.InstallmentService;
 import com.uas.platform.b2c.logistics.dao.ReceiptDao;
 import com.uas.platform.b2c.logistics.model.Receipt;
 import com.uas.platform.b2c.prod.product.common.service.CreateNumberService;
@@ -29,9 +33,13 @@ import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.b2c.trade.util.Preconditions;
 import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.model.*;
+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 org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -42,9 +50,7 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 
 /**
  * @author yujia
@@ -90,10 +96,16 @@ public class BankTransferServiceImpl implements BankTransferService {
 
 	private final BankTransAssociateDao transAssociateDao;
 
+	private final EnterpriseDao enterpriseDao;
+
+	private final InstallmentService installmentService;
+
 	@Autowired
-	public BankTransferServiceImpl(BankInfoDao bankInfoDao, BankTransAssociateDao transAssociateDao) {
+	public BankTransferServiceImpl(BankInfoDao bankInfoDao, BankTransAssociateDao transAssociateDao, EnterpriseDao enterpriseDao, InstallmentService installmentService) {
 		this.bankInfoDao = bankInfoDao;
 		this.transAssociateDao = transAssociateDao;
+		this.enterpriseDao = enterpriseDao;
+		this.installmentService = installmentService;
 	}
 
 	@Override
@@ -255,34 +267,45 @@ public class BankTransferServiceImpl implements BankTransferService {
 	public BankTransfer save(BankTransfer bankTransfer, String order) {
 		// 将转账信息的ID保存到订单类型中
 		String[] orderIds = order.split("-");
+		BankTransfer saveBankTransfer = new BankTransfer();
 
-		bankTransfer.setPayUseruu(SystemSession.getUser().getUserUU());
-		bankTransfer.setPayenuu(SystemSession.getUser().getEnterprise() != null ? SystemSession.getUser().getEnterprise().getUu() : null);
-		if (bankTransfer.getPayenuu() == null) {
-			bankTransfer.setDissociative(Type.PERSONAL.value());
-		} else {
-			bankTransfer.setDissociative(Type.ENTERPRISING.value());
-		}
-		bankTransfer.setCollectUseruu(sysConf.getAdminUU()); // 收款方 设置为应鹏账号
-		bankTransfer.setCollectenuu(sysConf.getEnUU()); // 收款方设置为B2C的uu
-		bankTransfer.setBanktranssn(EncodingRulesConstant.BANKTRANSFER.replace("_TIMESTAP_NUMBER", createNumberService.getTimeNumber("trade$bank_transfer", 8)));
-		bankTransfer.setTranferCreateTime(new Date());
-		bankTransfer.setOperateType(Type.MALL.value());
+		if (com.uas.platform.b2c.core.constant.Type.PAIDTOVENDOR.name().equals(bankTransfer.getType())) {// 付款类型为分期付款
+			if (orderIds.length > 1)
+				throw new IllegalOperatorException("多张订单合并付款只能向平台支付,如需直接支付给卖家,请前往 订单中心 进行单张支付");
 
-		BankTransfer saveBankTransfer = bankTransferDao.save(bankTransfer);
-
-		for (String orderId : orderIds) {
-			Order orderN = orderService.findByOrId(orderId);
-			if (orderN == null) {
-				throw new IllegalOperatorException("您要操作的订单不存在:" + orderId);
+			Order orderN = orderService.findByOrId(orderIds[0]);
+			if (orderN == null)
+				throw new IllegalOperatorException("您要操作的订单不存在:" + orderIds[0]);
+			if (orderN.getStatus() != Status.TOBEPAID.value() && orderN.getStatus() != com.uas.platform.b2c.core.constant.Status.TOBEPAIDAGAGIN.value() && orderN.getStatus() != com.uas.platform.b2c.core.constant.Status.PAID.value()) {
+				throw new IllegalOperatorException("您操作的订单不在待付款状态:" + orderIds[0]);
 			}
 
-			if (orderN.getStatus() != Status.TOBEPAID.value()) {
-				throw new IllegalOperatorException("您操作的订单不在待付款状态:" + orderId);
+			bankTransfer.setPayUseruu(SystemSession.getUser().getUserUU());
+			bankTransfer.setPayenuu(SystemSession.getUser().getEnterprise() != null ? SystemSession.getUser().getEnterprise().getUu() : null);
+			if (bankTransfer.getPayenuu() == null) {
+				bankTransfer.setDissociative(Type.PERSONAL.value());
+			} else {
+				bankTransfer.setDissociative(Type.ENTERPRISING.value());
 			}
 
+			List<BankInfo> bankInfos = bankInfoService.getEnterpriseBankInfoContainsStatus(Type.SUP.value(), Status.ALLOW.value(), orderN.getSellerenuu());
+			if (CollectionUtils.isEmpty(bankInfos))
+				throw new IllegalOperatorException("卖家收款账户不存在,请联系卖家");
+			Enterprise enterprise = enterpriseDao.findByUu(orderN.getSellerenuu());
+			if (enterprise == null)
+				throw new IllegalOperatorException("卖家企业不存在,请联系管理员");
+
+			bankTransfer.setCollectUseruu(enterprise.getEnAdminuu());
+			bankTransfer.setCollectenuu(orderN.getSellerenuu());
+
+			bankTransfer.setBanktranssn(EncodingRulesConstant.BANKTRANSFER.replace("_TIMESTAP_NUMBER", createNumberService.getTimeNumber("trade$bank_transfer", 8)));
+			bankTransfer.setTranferCreateTime(new Date());
+			bankTransfer.setOperateType(Type.SUP.value());
+
+			saveBankTransfer = bankTransferDao.save(bankTransfer);
+
 			BankTransAssociate bankTransAssociate = new BankTransAssociate();
-			bankTransAssociate.setBtaTableserNum(orderId);
+			bankTransAssociate.setBtaTableserNum(orderIds[0]);
 			bankTransAssociate.setBtaBanktranssn(saveBankTransfer.getBanktranssn());
 			btaDao.save(bankTransAssociate);
 
@@ -316,7 +339,74 @@ public class BankTransferServiceImpl implements BankTransferService {
 			}
 			purchaseDao.save(purchases);
 			orderDao.save(orderN);
+			// 单期分期付款
+			installmentService.paidInstallment(bankTransfer, orderN.getId());
+		} else {
+			bankTransfer.setPayUseruu(SystemSession.getUser().getUserUU());
+			bankTransfer.setPayenuu(SystemSession.getUser().getEnterprise() != null ? SystemSession.getUser().getEnterprise().getUu() : null);
+			if (bankTransfer.getPayenuu() == null) {
+				bankTransfer.setDissociative(Type.PERSONAL.value());
+			} else {
+				bankTransfer.setDissociative(Type.ENTERPRISING.value());
+			}
+
+			bankTransfer.setCollectUseruu(sysConf.getAdminUU()); // 收款方 设置为应鹏账号
+			bankTransfer.setCollectenuu(sysConf.getEnUU()); // 收款方设置为B2C的uu
+
+			bankTransfer.setBanktranssn(EncodingRulesConstant.BANKTRANSFER.replace("_TIMESTAP_NUMBER", createNumberService.getTimeNumber("trade$bank_transfer", 8)));
+			bankTransfer.setTranferCreateTime(new Date());
+			bankTransfer.setOperateType(Type.MALL.value());
+
+			saveBankTransfer = bankTransferDao.save(bankTransfer);
+
+			for (String orderId : orderIds) {
+				Order orderN = orderService.findByOrId(orderId);
+				if (orderN == null) {
+					throw new IllegalOperatorException("您要操作的订单不存在:" + orderId);
+				}
+
+				if (orderN.getStatus() != Status.TOBEPAID.value()) {
+					throw new IllegalOperatorException("您操作的订单不在待付款状态:" + orderId);
+				}
+
+				BankTransAssociate bankTransAssociate = new BankTransAssociate();
+				bankTransAssociate.setBtaTableserNum(orderId);
+				bankTransAssociate.setBtaBanktranssn(saveBankTransfer.getBanktranssn());
+				btaDao.save(bankTransAssociate);
+
+				orderN.setBanktfid(saveBankTransfer.getId());
+				Long userUU = SystemSession.getUser().getUserUU();
+				orderN.setStatusPaid(userUU);
+				Set<OrderDetail> orderDetails = orderN.getOrderDetails();
+				for (OrderDetail orderDetail : orderDetails) {
+					if(orderDetail.getStatus().intValue() == Status.TOBEPAID.value()) {
+						orderDetail.setStatusPaid(userUU);
+					}
+
+				}
+				orderN.setBuyaccount(bankTransfer.getJsonPament());
+				orderN.setSelleraccount(bankTransfer.getJsonReceive());
+				orderN.setPaytime(new Date());
+				orderN.setPaytype(Type.Payment_CompanyTransfer_Code.value());
+
+				//修改采购单的状态
+				List<Purchase> purchases = purchaseDao.findByOrderid(orderN.getOrderid());
+				for (Purchase purchase : purchases) {
+					if(purchase.getStatus().intValue() == Status.TOBECONFIRMED.value()) {
+						Set<PurchaseDetail> purchaseDetails = purchase.getPurchaseDetails();
+						for (PurchaseDetail purchaseDetail : purchaseDetails) {
+							if(purchaseDetail.getStatus().intValue() == Status.TOBECONFIRMED.value()) {
+								purchaseDetail.setStatusPaid(userUU);
+							}
+						}
+						purchase.setStatusPaid(userUU);
+					}
+				}
+				purchaseDao.save(purchases);
+				orderDao.save(orderN);
+			}
 		}
+
 		return saveBankTransfer;
 	}
 
@@ -432,7 +522,7 @@ public class BankTransferServiceImpl implements BankTransferService {
 		if (StringUtils.hasText(orderId)) {
 			Order order = orderDao.findByOrderid(orderId);
 			if (order != null && order.getBuyerenuu() != null) {
-				List<BankInfo> bankInfos = bankInfoDao.findByUseruuAndEnuuAndNumAndTypeAndOpraterUserTypeAndStatus(order.getBuyeruu(), order.getBuyerenuu(), 1, (short) 2, Type.BUYER.value(), Status.ALLOW.value());
+				List<BankInfo> bankInfos = bankInfoDao.findByUseruuAndEnuuAndNumAndOpraterUserTypeAndStatus(order.getBuyeruu(), order.getBuyerenuu(), 1, Type.BUYER.value(), Status.ALLOW.value());
 				if (!CollectionUtils.isEmpty(bankInfos)) {
 					return bankInfos.get(0);
 				}
@@ -449,8 +539,8 @@ public class BankTransferServiceImpl implements BankTransferService {
 	 * @return Page<BankTransfer>
 	 */
 	@Override
-	public ResultMap getVendorBankTransferByMall(PageParams params, Integer type) {
-		if(type == null || (type != Type.SUP.value() && type != Type.MALL.value()&&type != Type.MALL.value()) || params == null) {
+	public ResultMap getVendorBankTransferByMall(PageParams params, Integer type, String keyword, Long fromDate, Long toDate) {
+		if(type == null || (type != Type.SUP.value() && type != Type.MALL.value()) || params == null) {
 			return new ResultMap(CodeType.NO_INFO, "参数信息丢失");
 		}
 		final PageInfo info = new PageInfo(params);
@@ -458,6 +548,9 @@ public class BankTransferServiceImpl implements BankTransferService {
 			info.filter("operateType", type);
 			info.filter("collectenuu", SystemSession.getUser().getEnterprise().getUu());
 		}
+		info.expression(PredicateUtils.isNotNull("transferTime"));
+		filterPageInfo(info, keyword, fromDate, toDate);
+
 		Page<BankTransfer> pageBankTran = bankTransferDao.findAll(new Specification<BankTransfer>() {
 			@Override
 			public Predicate toPredicate(Root<BankTransfer> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
@@ -466,12 +559,56 @@ public class BankTransferServiceImpl implements BankTransferService {
 			}
 		}, info);
 		List<BankTransfer> content = pageBankTran.getContent();
+		Double totalPrice = 0.0d;
 		for (BankTransfer bankTransfer : content) {
+			totalPrice = NumberUtil.add(totalPrice, bankTransfer.getTotal());
 			List<BankTransAssociate> list = transAssociateDao.findByBtaBanktranssn(bankTransfer.getBanktranssn());
 			if(!CollectionUtils.isEmpty(list)) {
 				bankTransfer.setBankTransAssociate(list.get(0));
 			}
 		}
-		return ResultMap.success(pageBankTran);
+		Map<String, Object> resultMap = new HashMap<>();
+		resultMap.put("data", pageBankTran);
+		resultMap.put("total", totalPrice);
+		return ResultMap.success(resultMap);
+	}
+
+	@Override
+	public List<BankTransfer> getExportData(Integer type, String keyword, Long fromDate, Long toDate) {
+		if(type == null || (type != Type.SUP.value() && type != Type.MALL.value())) {
+			throw new IllegalOperatorException("参数丢失,刷新后重试");
+		}
+		final PageInfo info = new PageInfo();
+		if(type == Type.SUP.value()) {
+			info.filter("operateType", type);
+			info.filter("collectenuu", SystemSession.getUser().getEnterprise().getUu());
+		}
+		info.expression(PredicateUtils.isNotNull("transferTime"));
+		info.sorting(Sort.Direction.DESC, "transferTime");
+		filterPageInfo(info, keyword, fromDate, toDate);
+		List<BankTransfer> list = bankTransferDao.findAll(new Specification<BankTransfer>() {
+			@Override
+			public Predicate toPredicate(Root<BankTransfer> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
+				criteriaQuery.where(info.getPredicates(root, criteriaQuery, criteriaBuilder));
+				return null;
+			}
+		});
+		return list;
+	}
+
+	private void filterPageInfo(PageInfo info, String keyword, Long fromDate, Long toDate){
+		if (StringUtils.hasText(keyword)){
+			SimpleExpression[] simpArrs = new SimpleExpression[2];
+			simpArrs[0] = new SimpleExpression("orderid", keyword, CriterionExpression.Operator.LIKE, true);
+			simpArrs[1] = new SimpleExpression("buyerentername", keyword, CriterionExpression.Operator.LIKE, true);
+			LogicalExpression logical = new LogicalExpression(simpArrs, CriterionExpression.Operator.OR);
+			info.expression(logical);
+		}
+		if (fromDate != null) {
+			info.expression(PredicateUtils.gte("transferTime", new Date(fromDate), false));
+		}
+		if (toDate != null) {
+			info.expression(PredicateUtils.lte("transferTime", new Date(toDate), false));
+		}
 	}
 }

+ 365 - 0
src/main/java/com/uas/platform/b2c/fa/payment/service/impl/InstallmentServiceImpl.java

@@ -0,0 +1,365 @@
+package com.uas.platform.b2c.fa.payment.service.impl;
+
+import com.uas.platform.b2c.common.account.dao.EnterpriseDao;
+import com.uas.platform.b2c.common.account.dao.UserBaseInfoDao;
+import com.uas.platform.b2c.common.account.model.Enterprise;
+import com.uas.platform.b2c.common.account.model.UserBaseInfo;
+import com.uas.platform.b2c.common.base.service.SendMessageService;
+import com.uas.platform.b2c.core.constant.Status;
+import com.uas.platform.b2c.core.constant.Type;
+import com.uas.platform.b2c.core.support.SystemSession;
+import com.uas.platform.b2c.core.utils.NumberUtil;
+import com.uas.platform.b2c.fa.payment.dao.InstallmentDao;
+import com.uas.platform.b2c.fa.payment.dao.InstallmentDetailDao;
+import com.uas.platform.b2c.fa.payment.dao.InstallmentStoreDao;
+import com.uas.platform.b2c.fa.payment.model.*;
+import com.uas.platform.b2c.fa.payment.service.BankInfoService;
+import com.uas.platform.b2c.fa.payment.service.InstallmentService;
+import com.uas.platform.b2c.trade.order.dao.OrderDao;
+import com.uas.platform.b2c.trade.order.dao.PurchaseDao;
+import com.uas.platform.b2c.trade.order.dao.PurchaseDetailDao;
+import com.uas.platform.b2c.trade.order.model.Order;
+import com.uas.platform.b2c.trade.order.model.Purchase;
+import com.uas.platform.b2c.trade.order.model.PurchaseDetail;
+import com.uas.platform.core.exception.IllegalOperatorException;
+import com.uas.platform.core.util.mq.MessageType;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 分期支付service实现类
+ * @author wangyc
+ *
+ * @version 2017/9/7 9:07 wangyc
+ */
+@Service
+public class InstallmentServiceImpl implements InstallmentService{
+
+    private final InstallmentStoreDao installmentStoreDao;
+
+    private final PurchaseDao purchaseDao;
+
+    private final OrderDao orderDao;
+
+    private final InstallmentDao installmentDao;
+
+    private final BankInfoService bankInfoService;
+
+    private final InstallmentDetailDao installmentDetailDao;
+
+    private final PurchaseDetailDao purchaseDetailDao;
+
+    private final SendMessageService sendMessageService;
+
+    private final EnterpriseDao enterpriseDao;
+
+    private final UserBaseInfoDao userBaseInfoDao;
+
+    @Autowired
+    public InstallmentServiceImpl(InstallmentStoreDao installmentStoreDao, PurchaseDao purchaseDao, OrderDao orderDao, InstallmentDao installmentDao, BankInfoService bankInfoService, InstallmentDetailDao installmentDetailDao, PurchaseDetailDao purchaseDetailDao, SendMessageService sendMessageService, EnterpriseDao enterpriseDao, UserBaseInfoDao userBaseInfoDao) {
+        this.installmentStoreDao = installmentStoreDao;
+        this.purchaseDao = purchaseDao;
+        this.orderDao = orderDao;
+        this.installmentDao = installmentDao;
+        this.bankInfoService = bankInfoService;
+        this.installmentDetailDao = installmentDetailDao;
+        this.purchaseDetailDao = purchaseDetailDao;
+        this.sendMessageService = sendMessageService;
+        this.enterpriseDao = enterpriseDao;
+        this.userBaseInfoDao = userBaseInfoDao;
+    }
+
+    @Override
+    public Installment createInstallment(Installment installment, Long purchaseId) {
+        // 基础验证
+        validationEnableInstallment(purchaseId);
+
+        Purchase purchase = purchaseDao.findOne(purchaseId);
+
+        // 如果之前具有分期信息,删除分期信息
+        if (purchase.getInstallmentId() != null) {
+            Installment oldInstallment = installmentDao.findOne(purchase.getInstallmentId());
+            if (oldInstallment != null)
+                installmentDao.delete(oldInstallment.getId());
+        }
+
+        Set<InstallmentDetail> installmentDetails = installment.getInstallmentDetails();
+        if (CollectionUtils.isEmpty(installmentDetails))
+            throw new IllegalOperatorException("分期详情为空,请您设置分期详情");
+
+        for(InstallmentDetail installmentDetail : installmentDetails) {
+            installmentDetail.setStatus(Status.TOBEPAID.value());
+        }
+
+        // 设置分期基本信息
+        installment.setSellerenuu(SystemSession.getUser().getEnterprise().getUu());
+        installment.setStatus(Status.TOBEPAID.value());
+        installment.setCount(installmentDetails.size());
+        installment.setCurrentNo((short) 1);
+        installment.setOrderNum(purchase.getOrderid());
+        installment.setPurchaseId(purchaseId);
+
+        Order order = orderDao.findOrderByOrderid(purchase.getOrderid());
+        if (order == null)
+            throw new IllegalOperatorException("此订单不存在,请重新确认信息");
+
+        installment.setOrderId(order.getId());
+        installment.setPrice(purchase.getPrice());
+        installment.setInstallmentDetails(installmentDetails);
+
+        // 保存分期信息
+        installment = installmentDao.save(installment);
+
+        for (InstallmentDetail installmentDetail : installmentDetails) {
+            installmentDetail.setInstallment(installment);
+            installmentDetail.setInstallmentId(installment.getId());
+        }
+
+        installmentDetailDao.save(installmentDetails);
+
+        // 订单、采购单保存分期id
+        purchase.setInstallmentId(installment.getId());
+        order.setInstallmentId(installment.getId());
+
+        purchaseDao.save(purchase);
+        orderDao.save(order);
+
+        return installment;
+    }
+
+    @Override
+    public Installment updateInstallment(Installment installment, Long purchaseId) {
+        // 基础验证
+        validationEnableInstallment(purchaseId);
+
+        Purchase purchase = purchaseDao.findOne(purchaseId);
+
+        Set<InstallmentDetail> installmentDetails = installment.getInstallmentDetails();
+        if (CollectionUtils.isEmpty(installmentDetails))
+            throw new IllegalOperatorException("分期详情为空,请您设置分期详情");
+
+        Installment oldInstallment = installmentDao.findByPurchaseId(purchaseId);
+        if (oldInstallment == null)
+            throw new IllegalOperatorException("此订单分期信息不存在,请重新确认信息");
+
+
+//        installmentDao.delete(oldInstallment.getId());
+
+        for(InstallmentDetail installmentDetail : installmentDetails) {
+            installmentDetail.setStatus(Status.TOBEPAID.value());
+        }
+
+        // 设置分期基本信息
+        installment.setSellerenuu(SystemSession.getUser().getEnterprise().getUu());
+        installment.setStatus(Status.TOBEPAID.value());
+        installment.setCount(installmentDetails.size());
+        installment.setCurrentNo((short) 1);
+        installment.setOrderNum(purchase.getOrderid());
+        installment.setPurchaseId(purchaseId);
+
+        Order order = orderDao.findByOrderid(purchase.getOrderid());
+        if (order == null)
+            throw new IllegalOperatorException("此订单不存在,请重新确认信息");
+
+        installment.setOrderId(order.getId());
+        installment.setPrice(purchase.getPrice());
+        installment.setInstallmentDetails(installmentDetails);
+
+        oldInstallment.getInstallmentDetails().clear();
+
+        // 保存分期信息
+        BeanUtils.copyProperties(installment, oldInstallment, "installmentDetails");
+        oldInstallment = installmentDao.save(oldInstallment);
+        for (InstallmentDetail installmentDetail : installment.getInstallmentDetails()) {
+            installmentDetail.setInstallmentId(oldInstallment.getId());
+        }
+        installmentDetailDao.save(installment.getInstallmentDetails());
+
+        return oldInstallment;
+    }
+
+    @Override
+    public Installment paidInstallment(BankTransfer bankTransfer, Long orderId) {
+        // 验证分期明细合法性
+        InstallmentDetail installmentDetail = installmentDetailDao.findOne(bankTransfer.getInstallmentDetailId());
+        if (installmentDetail == null)
+            throw new IllegalOperatorException("该订单分期信息不存在,请重新确认订单");
+        if (!orderId.equals(installmentDetail.getInstallment().getOrderId()))
+            throw new IllegalOperatorException("此分期信息与该订单不符,请重新确认分期信息");
+        if (Status.TOBEPAID.value() != installmentDetail.getStatus().intValue() && Status.PAID.value() != installmentDetail.getStatus().intValue())
+            throw new IllegalOperatorException("此次付款分期不为待付款状态,请重新确认分期信息");
+
+        // 更新分期信息状态为付款中
+        Installment installment = installmentDetail.getInstallment();
+        if (!installment.getCurrentNo().equals(installmentDetail.getDetno())) {
+            throw new IllegalOperatorException("此次付款分期与应付分期信息不符,请重新确认分期信息");
+        }
+        if ((Status.TOBEPAID.value() != installment.getStatus().intValue()) && (Status.PAID.value() != installment.getStatus().intValue())) {
+            throw new IllegalOperatorException("此分期不为待付款状态,请重新确认分期信息");
+        }
+
+        installment.setStatus(com.uas.platform.b2c.core.constant.Status.PAID.value());
+
+        installmentDetail.setPaidDate(new Date());
+        installmentDetail.setImgs(bankTransfer.getImgUrl());
+        installmentDetail.setPricesArr(bankTransfer.getPricesArr());
+        installmentDetail.setStatus(com.uas.platform.b2c.core.constant.Status.PAID.value());
+
+        installmentDetailDao.save(installmentDetail);
+
+        Order order = orderDao.findOne(orderId);
+
+        if (order == null)
+            throw new IllegalOperatorException("订单不存在,请重新确认订单信息");
+        List<Purchase> purchases = purchaseDao.findByOrderid(order.getOrderid());
+
+        if (CollectionUtils.isNotEmpty(purchases)) {
+            for (Purchase purchase : purchases) {
+                Enterprise enterprise = enterpriseDao.findByUu(purchase.getSellerenuu());
+                if (enterprise == null)
+                    throw new IllegalOperatorException("卖家企业不存在,请重新确认");
+                UserBaseInfo admin = userBaseInfoDao.findUserByUserUU(enterprise.getEnAdminuu());
+                if (admin == null)
+                    throw new IllegalOperatorException("卖家管理员不存在,请联系卖家");
+                // 发送信息
+                sendMessageService.sendMessageForInstallmentPay(purchase.getSellername(), purchase.getBuyername(), installmentDetail.getPrice(),
+                        admin.getUserTel(), MessageType.orderpay);
+            }
+        }
+
+        return installmentDao.save(installment);
+    }
+
+    @Override
+    public void deleteInstallment(Long purchaseId) {
+        validatePurchase(purchaseId);
+        Purchase purchase = purchaseDao.findOne(purchaseId);
+        Order order = orderDao.findByOrderid(purchase.getOrderid());
+
+        Installment installment = installmentDao.findByPurchaseId(purchaseId);
+        if (installment == null)
+            throw new IllegalOperatorException("分期信息不存在,请重新确认分期信息");
+
+        order.setInstallmentId(null);
+        purchase.setInstallmentId(null);
+
+        orderDao.save(order);
+        purchaseDao.save(purchase);
+
+        installmentDao.delete(installment.getId());
+    }
+
+    @Override
+    public Installment updateAfterModifyPurchasePrice(String purchaseDetailId) {
+        PurchaseDetail purchaseDetail = purchaseDetailDao.findByDetailid(purchaseDetailId);
+        if (purchaseDetail == null)
+            throw new IllegalOperatorException("订单改价明细数据不存在,请重新确认订单信息");
+        Purchase purchase = purchaseDetail.getPurchase();
+
+        if (purchase != null && purchase.getInstallmentId() != null)
+            validationEnableInstallment(purchase.getId());
+
+        Installment installment = installmentDao.findByPurchaseId(purchase.getId());
+
+        Double total = purchase.getPrice();
+        Double installTotal = installment.getPrice();
+        Double dvalue = 0d;
+
+        if (NumberUtil.compare(total, installTotal) == 1) {
+            InstallmentDetail installmentDetail = installmentDetailDao.findByInstallmentIdAndDetno(installment.getId(), installment.getCount().shortValue());
+            installmentDetail.setPrice(NumberUtil.pricesScaleTwo(total - installTotal + installmentDetail.getPrice()));
+            installmentDetailDao.save(installmentDetail);
+        }
+
+
+
+        if (NumberUtil.compare(total, installTotal) == -1) {
+            for (short i = 1; i < installment.getCount() + 1; i++) {
+                InstallmentDetail installmentDetail = installmentDetailDao.findByInstallmentIdAndDetno(installment.getId(), i);
+                if (installmentDetail == null) {
+                    break;
+                }
+
+                dvalue = total - installmentDetail.getPrice();
+
+                if (dvalue <= 0) {
+                    installmentDetail.setPrice(NumberUtil.pricesScaleTwo(total));
+                    installmentDetailDao.save(installmentDetail);
+                    installmentDetailDao.deleteGtDetno(installment.getId(), i);
+
+                    Iterator<InstallmentDetail> it = installment.getInstallmentDetails().iterator();
+                    if (it.hasNext()) {
+                        InstallmentDetail installmentDetail1 = it.next();
+                        if (installmentDetail.getDetno() > i) {
+                            it.remove();
+                        }
+                    }
+
+                    break;
+                } else {
+                    total = dvalue;
+                }
+            }
+        }
+
+        installment.setPrice(purchase.getPrice());
+        installment.setCount(installment.getInstallmentDetails().size());
+
+        return installmentDao.save(installment);
+    }
+
+    @Override
+    public String validationEnableInstallment(Long purchaseId) {
+        validatePurchase(purchaseId);// 验证采购单、订单信息
+        validateBankInfo(Type.SUP.value(), Status.ALLOW.value());// 验证银行账户信息
+        validateInstallmentStore();// 验证是否设置分期权限
+        return "success";
+    }
+
+    void validateInstallmentStore() {
+        InstallmentStore installmentStore = installmentStoreDao.findByEnuuAndEnable(SystemSession.getUser().getEnterprise().getUu(), (short) 1);
+        if (installmentStore == null)
+            throw new IllegalOperatorException("当前企业没有设置分期功能权限,如有需要请联系客服");
+    }
+
+    /**
+     * 验证是否有收款账户
+     * @param type
+     * @param status
+     */
+    void validateBankInfo(Integer type, Integer status) {
+        List<BankInfo> bankInfos = bankInfoService.getEnterpriseBankInfoContainsStatus(type, status);
+        if (CollectionUtils.isEmpty(bankInfos))
+            throw new IllegalOperatorException("当前企业没有设置收款账户,请在 结算中心--收款账户信息 管理您的收款账户信息");
+    }
+
+    /**
+     * 验证采购单、订单信息
+     * @param purchaseId
+     */
+    void validatePurchase(Long purchaseId) {
+        if (SystemSession.getUser().getEnterprise() == null)
+            throw new IllegalOperatorException("当前账户为个人账户,请选择企业后再执行此操作");
+
+        Purchase purchase = purchaseDao.findOne(purchaseId);
+        if (purchase == null)
+            throw new IllegalOperatorException("订单不存在,请重新确认订单信息");
+        if (!SystemSession.getUser().getEnterprise().getUu().equals(purchase.getSellerenuu()))
+            throw new IllegalOperatorException("此订单不属于当前企业,请重新确认订单信息");
+        if (Status.TOBECONFIRMED.value() != purchase.getStatus().intValue())
+            throw new IllegalOperatorException("此订单状态不为待付款,不可修改分期信息");
+
+        Order order = orderDao.findByOrderid(purchase.getOrderid());
+        if (order == null)
+            throw new IllegalOperatorException("订单不存在,请重新确认订单信息");
+        if (Status.TOBEPAID.value() != order.getStatus().intValue() && Status.TOBECONFIRMED.value() != order.getStatus().intValue())
+            throw new IllegalOperatorException("此订单状态不为待付款,不可修改分期信息");
+    }
+}

+ 98 - 0
src/main/java/com/uas/platform/b2c/fa/payment/service/impl/InstallmentStoreServiceImpl.java

@@ -0,0 +1,98 @@
+package com.uas.platform.b2c.fa.payment.service.impl;
+
+import com.uas.platform.b2c.core.support.SystemSession;
+import com.uas.platform.b2c.fa.payment.dao.InstallmentStoreDao;
+import com.uas.platform.b2c.fa.payment.model.InstallmentStore;
+import com.uas.platform.b2c.fa.payment.service.InstallmentStoreService;
+import com.uas.platform.b2c.prod.store.dao.StoreInDao;
+import com.uas.platform.b2c.prod.store.model.StoreIn;
+import com.uas.platform.core.exception.IllegalOperatorException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 分期权限店铺service实现类
+ * @author wangyc
+ *
+ * @version 2017/9/7 11:23 wangyc
+ */
+@Service
+public class InstallmentStoreServiceImpl implements InstallmentStoreService{
+
+    private final InstallmentStoreDao installmentStoreDao;
+
+    private final StoreInDao storeInDao;
+
+    @Autowired
+    public InstallmentStoreServiceImpl(InstallmentStoreDao installmentStoreDao, StoreInDao storeInDao) {
+        this.installmentStoreDao = installmentStoreDao;
+        this.storeInDao = storeInDao;
+    }
+
+    @Override
+    public InstallmentStore saveStore(String storeUuid) {
+        StoreIn storeIn = storeInDao.findByUuid(storeUuid);
+        if (storeIn == null)
+            throw new IllegalOperatorException("此店铺不存在,请重新确认店铺信息");
+
+        InstallmentStore installmentStore = installmentStoreDao.findByStoreUuid(storeUuid);
+        if (installmentStore != null) {
+            throw new IllegalOperatorException("店铺: " + storeIn.getStoreName() + " 已存在权限列表中,如需维护请找到该店铺进行维护");
+        } else {
+            installmentStore = new InstallmentStore();
+        }
+
+        installmentStore.setEnable((short) 1);
+        installmentStore.setEnuu(storeIn.getEnUU());
+        installmentStore.setStoreId(storeIn.getId());
+        installmentStore.setStoreUuid(storeUuid);
+
+        return installmentStoreDao.save(installmentStore);
+    }
+
+    @Override
+    public void deleteStore(String storeUuid) {
+        InstallmentStore installmentStore = installmentStoreDao.findByStoreUuid(storeUuid);
+        if (installmentStore == null)
+            throw new IllegalOperatorException("此店铺并不存在权限列表中,无需删除");
+        installmentStoreDao.delete(installmentStore.getId());
+    }
+
+    @Override
+    public InstallmentStore capsOFF(String storeUuid) {
+        return toggleStore(storeUuid, (short) 0);
+    }
+
+    @Override
+    public InstallmentStore capsON(String storeUuid) {
+        return toggleStore(storeUuid, (short) 1);
+    }
+
+    /**
+     * 启用/禁用店铺
+     * @param enable
+     * @return
+     */
+    public InstallmentStore toggleStore(String storeUuid, short enable) {
+        InstallmentStore installmentStore = installmentStoreDao.findByStoreUuid(storeUuid);
+        if (installmentStore == null)
+            throw new IllegalOperatorException("此店铺并不存在权限列表中,无需删除");
+
+        installmentStore.setEnable(enable);
+
+        return installmentStoreDao.save(installmentStore);
+    }
+
+    @Override
+    public String capsOFFVerify() {
+        if (SystemSession.getUser().getEnterprise() == null)
+            throw new IllegalOperatorException("当前用户为个人用户,请选择企业进行分期操作");
+
+        InstallmentStore installmentStore = installmentStoreDao.findByEnuuAndEnable(SystemSession.getUser().getEnterprise().getUu(), (short) 1);
+        if (installmentStore == null) {
+            return "fail";
+        } else {
+            return "success";
+        }
+    }
+}

+ 7 - 1
src/main/java/com/uas/platform/b2c/fa/settlement/service/impl/SettlementServiceImpl.java

@@ -483,11 +483,17 @@ public class SettlementServiceImpl implements SettlementService {
 			transfer.setCollectenuu(bankTransfer.getCollectenuu());
 			transfer.setCollectUseruu(bankTransfer.getCollectUseruu());
 			transfer.setImgUrl(bankTransfer.getImgUrl());
+			//买家姓名和企业名
+			transfer.setBuyername(purchase.getBuyername());
+			transfer.setBuyerentername(purchase.getBuyentername());
+			transfer.setOrderid(purchase.getOrderid());
+			transfer.setPuid(purchase.getPurchaseid());
+
 			//收方和付方的账户信息
 			transfer.setJsonPament(bankTransfer.getJsonPament());
 			transfer.setJsonReceive(bankTransfer.getJsonReceive());
 			transfer.setTranferCreateTime(new Date());
-			transfer.setTransferTime(bankTransfer.getTransferTime());
+			transfer.setTransferTime(new Date());
 			bankTransferList.add(transfer);
 
 			//转账和订单的关联信息

+ 15 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/model/Goods.java

@@ -475,6 +475,13 @@ public class Goods implements Serializable {
 	@Column(name= "go_perqty")
 	private Double perQty;
 
+	/**
+	 * 商品的点击次数
+	 */
+	@Column(name = "go_visit_count")
+	private Long visitCount;
+
+
 	@Transient
 	private String selfSale;
 
@@ -522,6 +529,14 @@ public class Goods implements Serializable {
 		this.id = id;
 	}
 
+	public Long getVisitCount() {
+		return visitCount;
+	}
+
+	public void setVisitCount(Long visitCount) {
+		this.visitCount = visitCount;
+	}
+
 	public String getUuid() {
 		return uuid;
 	}

+ 10 - 3
src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ReleaseProductByBatchServiceImpl.java

@@ -27,6 +27,7 @@ import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.ReleaseStatus;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.hssf.usermodel.HSSFDateUtil;
 import org.apache.poi.ss.usermodel.*;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -326,7 +327,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 					}
 
 					// 最小包单价
-					Object priceMinPackQtyCellValue = readWorkBookCell(row.getCell(9), Cell.CELL_TYPE_STRING, r, 9);
+					Object priceMinPackQtyCellValue = readWorkBookCell(row.getCell(9), Cell.CELL_TYPE_NUMERIC, r, 9);
 					releaseProductByBatch.setMinPackPriceStr(StringUtilB2C.getStr(priceMinPackQtyCellValue));
 					if ((priceMinPackQtyCellValue != null)&&(isNumber(priceMinPackQtyCellValue.toString())) && (NumberUtil.compare(Double.valueOf(priceMinPackQtyCellValue.toString()), 0.0d) > 0)) {
 						Double price = Double.valueOf(priceMinPackQtyCellValue.toString());
@@ -573,7 +574,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 			if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK) {
 				switch (cellType) {
 				case Cell.CELL_TYPE_STRING:
-					cell.setCellType(Cell.CELL_TYPE_STRING);
+					cell.setCellType(HSSFCell.CELL_TYPE_STRING);
 					String str = cell.getStringCellValue().trim();
 //					Object data = getCellData(cell);
 //					String str = data == null ? "" : data.toString();
@@ -586,6 +587,12 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 				case Cell.CELL_TYPE_NUMERIC:
 					cell.setCellType(Cell.CELL_TYPE_NUMERIC);
 					obj = cell.getNumericCellValue();
+					if(obj != null) {
+						if(obj.toString().indexOf("E") > 0) {
+							BigDecimal b = new BigDecimal(obj.toString());
+							obj = b.toPlainString();
+						}
+					}
 					break;
 				default:
 					if(cell.getCellType() == Cell.CELL_TYPE_STRING) {
@@ -688,7 +695,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 		Object endQtyCellValue = readWorkBookCell(cellQty, Cell.CELL_TYPE_STRING, r, num);
 		releaseProductByBatch.setFragmentQty(StringUtilB2C.getStr(endQtyCellValue), i);
 
-		Object priceCellValue = readWorkBookCell(cellPrice, Cell.CELL_TYPE_STRING, r, num + 1);
+		Object priceCellValue = readWorkBookCell(cellPrice, Cell.CELL_TYPE_NUMERIC, r, num + 1);
 		releaseProductByBatch.setFragmentPrice(StringUtilB2C.getStr(priceCellValue), i);
 		if ((endQtyCellValue != null)&&(isNumber(endQtyCellValue.toString())) && (NumberUtil.compare(Double.valueOf(endQtyCellValue.toString()), 0.0d) > 0)) {
 			Double end = Double.valueOf(endQtyCellValue.toString());

+ 28 - 0
src/main/java/com/uas/platform/b2c/prod/product/brand/modal/Brand.java

@@ -151,6 +151,18 @@ public class Brand implements Serializable {
 	@Column(name = "br_weight")
 	private Double weight;
 
+	/**
+	 * 品牌的点击次数
+	 */
+	@Column(name = "br_visit_count")
+	private Long visitCount;
+
+	/**
+	 * 品牌的搜索次数
+	 */
+	@Column(name = "br_search_count")
+	private Long searchCount;
+
 	public Long getId() {
 		return id;
 	}
@@ -319,6 +331,22 @@ public class Brand implements Serializable {
 		this.inital = inital;
 	}
 
+	public Long getVisitCount() {
+		return visitCount;
+	}
+
+	public void setVisitCount(Long visitCount) {
+		this.visitCount = visitCount;
+	}
+
+	public Long getSearchCount() {
+		return searchCount;
+	}
+
+	public void setSearchCount(Long searchCount) {
+		this.searchCount = searchCount;
+	}
+
 	public Brand() {
 
 	}

+ 2 - 2
src/main/java/com/uas/platform/b2c/prod/product/component/dao/ComponentCrawlDao.java

@@ -35,7 +35,7 @@ public interface ComponentCrawlDao extends JpaSpecificationExecutor<ComponentCra
 	 * @param task
 	 * @return
 	 */
-	@Query("select distinct c.img from ComponentCrawl c where c.task = :taskId")
+	@Query("select distinct c.img from ComponentCrawl c where c.task = :taskId and c.img is not null and c.b2cImg is null")
 	public List<String> findImgByTask(@Param("taskId") Long task);
 
 	/**
@@ -43,6 +43,6 @@ public interface ComponentCrawlDao extends JpaSpecificationExecutor<ComponentCra
 	 * @param task
 	 * @return
 	 */
-	@Query("select distinct c.attach from ComponentCrawl c where c.task = :taskId")
+	@Query("select distinct c.attach from ComponentCrawl c where c.task = :taskId and c.attach is not null and c.b2cAttach is null")
 	public List<String> findAttachByTask(@Param("taskId") Long task);
 }

+ 28 - 0
src/main/java/com/uas/platform/b2c/prod/product/component/modal/Component.java

@@ -301,6 +301,18 @@ public class Component implements Serializable {
 	@Column(name = "cmp_inastockqty")
 	private Double inactionStockQty;
 
+	/**
+	 * 器件的点击次数
+	 */
+	@Column(name = "cmp_visit_count")
+	private Long visitCount;
+
+	/**
+	 * 器件的搜索次数
+	 */
+	@Column(name = "cmp_search_count")
+	private Long searchCount;
+
 	/**
 	 * 废料数量
 	 */
@@ -315,6 +327,22 @@ public class Component implements Serializable {
 		this.id = id;
 	}
 
+	public Long getVisitCount() {
+		return visitCount;
+	}
+
+	public void setVisitCount(Long visitCount) {
+		this.visitCount = visitCount;
+	}
+
+	public Long getSearchCount() {
+		return searchCount;
+	}
+
+	public void setSearchCount(Long searchCount) {
+		this.searchCount = searchCount;
+	}
+
 	public String getUuid() {
 		return uuid;
 	}

+ 28 - 0
src/main/java/com/uas/platform/b2c/prod/product/kind/model/Kind.java

@@ -91,6 +91,18 @@ public class Kind implements Serializable {
 	@Column(name = "ki_cmpsuffix")
 	private Long componentsuffix;
 
+	/**
+	 * 类目的点击次数
+	 */
+	@Column(name = "ki_visit_count")
+	private Long visitCount;
+
+	/**
+	 * 类目的搜索次数
+	 */
+	@Column(name = "ki_search_count")
+	private Long searchCount;
+
 	/**
 	 * 包含的属性
 	 */
@@ -232,6 +244,22 @@ public class Kind implements Serializable {
 		this.componentsuffix = componentsuffix;
 	}
 
+	public Long getVisitCount() {
+		return visitCount;
+	}
+
+	public void setVisitCount(Long visitCount) {
+		this.visitCount = visitCount;
+	}
+
+	public Long getSearchCount() {
+		return searchCount;
+	}
+
+	public void setSearchCount(Long searchCount) {
+		this.searchCount = searchCount;
+	}
+
 	/*
 	 * public KindUas converUas(Kind kind){ KindUas uas = new KindUas();
 	 * uas.setComponentPrefix(kind.getComponentPrefix());

+ 80 - 5
src/main/java/com/uas/platform/b2c/trade/order/controller/OrderController.java

@@ -8,9 +8,11 @@ import com.uas.platform.b2c.common.account.service.VendorService;
 import com.uas.platform.b2c.core.constant.SplitChar;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.support.log.UsageBufferedLogger;
+import com.uas.platform.b2c.core.support.view.JxlsExcelView;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.b2c.core.utils.StringUtilB2C;
 import com.uas.platform.b2c.fa.payment.model.BankTransfer;
+import com.uas.platform.b2c.prod.commodity.model.ProductStandardPutOnInfo;
 import com.uas.platform.b2c.trade.inquiry.model.TradeCharge;
 import com.uas.platform.b2c.trade.order.model.Order;
 import com.uas.platform.b2c.trade.order.model.OrderDetail;
@@ -28,13 +30,13 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.ui.ModelMap;
 import org.springframework.util.StringUtils;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
 
 import javax.management.OperationsException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
@@ -576,6 +578,28 @@ public class OrderController {
 		return orderService.releaseOrder(orderid, reason);
 	}
 
+	/**
+	 * 买家同意卖家发起的取消订单申请
+	 * @param orderid
+	 * @return
+	 */
+	@RequestMapping(value = "simpleinfo/ones/{orderid}/release/audit", method = RequestMethod.PUT)
+	public String aduitReleaseOrder(@PathVariable String orderid) {
+		logger.log("买家订单管理", "同意取消订单申请", "根据订单号: " + orderid + "取消订单,释放库存");
+		return orderService.aduitReleaseOrder(orderid);
+	}
+
+	/**
+	 * 买家不同意卖家发起的取消订单申请
+	 * @param orderid
+	 * @return
+	 */
+	@RequestMapping(value = "simpleinfo/ones/{orderid}/release/unaudit", method = RequestMethod.PUT)
+	public String unaduitReleaseOrder(@PathVariable String orderid) {
+		logger.log("买家订单管理", "不同意取消订单申请");
+		return orderService.unaduitReleaseOrder(orderid);
+	}
+
 	/**
 	 * 失效订单 (因确认是订单批次库存不足)
 	 *
@@ -881,6 +905,57 @@ public class OrderController {
 		return orderService.getBuyPayRecord(params);
 	}
 
+	/**
+	 * 分页获取买家支付记录,暂时从订单中直接获取
+	 * 判断条件--存在支付时间
+	 *
+	 * @param params
+	 * @param keyword
+	 * @param fromDate
+	 * @param toDate
+	 * @return
+	 */
+	@RequestMapping(value = "buyer/payRecord")
+	public Page<OrderSimpleInfo> findBuyerPayRecord(PageParams params, String keyword, Long fromDate,
+													Long toDate, String currencyName, Integer method){
+		return orderService.getBuyerPayRecord(params, keyword, fromDate, toDate, currencyName, method);
+	}
+
+	/**
+	 * 导出支付记录到excel表中
+	 * @param isAjax
+	 * @param request
+	 * @param keyword
+	 * @param fromDate
+	 * @param toDate
+	 * @param currencyName
+	 * @param method
+	 * @return
+	 */
+	@RequestMapping(value = "/export/payRecord", method = RequestMethod.POST)
+	public ModelAndView exportPayRecordToExcel(@RequestParam(required = false, value = "isAjax", defaultValue = "false")Boolean isAjax, HttpServletRequest request,
+											   String keyword, Long fromDate, Long toDate, String currencyName, Integer method){
+		HttpSession session = request.getSession();
+		ModelAndView modelAndView = new ModelAndView();
+		Object loading = session.getAttribute("loading");
+		if(isAjax) {
+			MappingJackson2JsonView view = new MappingJackson2JsonView();
+			Map<String, Boolean> attributes = new HashMap<>();
+			Boolean isLoading= loading == Boolean.TRUE;
+			attributes.put("loading", isLoading);
+			view.setAttributesMap(attributes);
+			modelAndView.setView(view);
+			return modelAndView;
+		}
+		session.setAttribute("loading", true);
+		List<OrderSimpleInfo> data = orderService.getExportData(keyword, fromDate, toDate, currencyName, method);
+		modelAndView.addObject("data", data);
+		modelAndView.addObject("operator", "-");
+		modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/payRecord", "优软商城-买家交易记录"));
+		session.setAttribute("loading", false);
+		return modelAndView;
+	}
+
 	/**
 	 * 根据订单号获取Order对象
 	 *

+ 15 - 2
src/main/java/com/uas/platform/b2c/trade/order/controller/PurchaseController.java

@@ -278,10 +278,10 @@ public class PurchaseController {
 	 * @return the purchase
 	 */
 	@RequestMapping(value = "/{id}/ensurePaid", method = RequestMethod.PUT)
-	public Purchase ensurePaid(@PathVariable Long id) {
+	public Purchase ensurePaid(@PathVariable Long id, Long installmentDetailId) {
 		assert logger != null;
 		logger.log("采购单管理", "确认付款,采购单id: " + id);
-		return purchaseService.ensurePaid(id);
+		return purchaseService.ensurePaid(id, installmentDetailId);
 	}
 
 	/**
@@ -600,6 +600,19 @@ public class PurchaseController {
 		return purchaseService.findOrderIdByPuId(purchaseId);
 	}
 
+	/**
+	 * 卖家取消订单 释放库存
+	 *
+	 * @param purchaseId the purchaseId
+	 * @param reason  the reason
+	 * @return the string
+	 */
+	@RequestMapping(value = "simpleinfo/ones/{purchaseId}/release", method = RequestMethod.PUT)
+	public String release(@PathVariable String purchaseId, String reason) {
+		logger.log("卖家订单管理", "取消订单", "根据订单号: " + purchaseId + "取消订单,释放库存");
+		return purchaseService.release(purchaseId, reason);
+	}
+
 //	@RequestMapping(value = "/logistics")
 //	public Logistics findOneLogistics(){
 //		return null;

+ 47 - 0
src/main/java/com/uas/platform/b2c/trade/order/model/Order.java

@@ -8,6 +8,7 @@ import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.core.constant.Status;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.utils.StringUtilB2C;
+import com.uas.platform.b2c.fa.payment.model.Installment;
 import com.uas.platform.b2c.logistics.model.InvoiceFOrder;
 import com.uas.platform.b2c.prod.product.common.service.CreateNumberService;
 import com.uas.platform.b2c.trade.aftersale.model.AfterSaleStatus;
@@ -615,6 +616,18 @@ public class Order extends Document implements Serializable {
 	@Transient
 	private boolean selfSell;
 
+	/**
+	 * 分期信息id
+	 */
+	@Column(name = "or_installmentid")
+	private Long installmentId;
+
+	/**
+	 * 分期信息(不做关联)
+	 */
+	@Transient
+	private Installment installment;
+
 	/**
 	 * Gets expiration time.
 	 *
@@ -1229,6 +1242,22 @@ public class Order extends Document implements Serializable {
 		return this;
 	}
 
+	public Long getInstallmentId() {
+		return installmentId;
+	}
+
+	public void setInstallmentId(Long installmentId) {
+		this.installmentId = installmentId;
+	}
+
+	public Installment getInstallment() {
+		return installment;
+	}
+
+	public void setInstallment(Installment installment) {
+		this.installment = installment;
+	}
+
 	/**
 	 * Sets status.
 	 *
@@ -1447,6 +1476,24 @@ public class Order extends Document implements Serializable {
 		this.statushistory = addStatusHistory(this.statushistory, uu, this.status);
 	}
 
+	/**
+	 * 卖家确认分期付款(未完全付完)
+	 * @param uu
+	 */
+	public void setStatusToBePaidAgain(Long uu) {
+		this.status = com.uas.platform.b2c.core.constant.Status.TOBEPAIDAGAGIN.value();
+		this.statushistory = addStatusHistory(this.statushistory, uu, this.status);
+	}
+
+	/**
+	 * 卖家申请取消订单(未完全付完)
+	 * @param uu
+	 */
+	public void setStatusCancelToBeConfirmed(Long uu) {
+		this.status = com.uas.platform.b2c.core.constant.Status.CANCELTOBECONFIRMED.value();
+		this.statushistory = addStatusHistory(this.statushistory, uu, this.status);
+	}
+
 	/**
 	 * 售后中(只能单次单次的售后,暂时先这么处理)
 	 *

+ 18 - 0
src/main/java/com/uas/platform/b2c/trade/order/model/OrderDetail.java

@@ -1532,6 +1532,15 @@ public class OrderDetail extends Document implements Serializable{
 		this.statushistory = addStatusHistory(this.statushistory, uu, this.status);
 	}
 
+	/**
+	 * 卖家申请取消订单(未完全付完)
+	 * @param uu
+	 */
+	public void setStatusCancelToBeConfirmed(Long uu) {
+		this.status = com.uas.platform.b2c.core.constant.Status.CANCELTOBECONFIRMED.value();
+		this.statushistory = addStatusHistory(this.statushistory, uu, this.status);
+	}
+
 	/**
 	 * Sets status unavailable return.
 	 *
@@ -1616,6 +1625,15 @@ public class OrderDetail extends Document implements Serializable{
 		this.statushistory = addStatusHistory(this.statushistory, uu, this.status);
 	}
 
+	/**
+	 * 卖家确认分期付款(未完全付完)
+	 * @param uu
+	 */
+	public void setStatusToBePaidAgain(Long uu) {
+		this.status = com.uas.platform.b2c.core.constant.Status.TOBEPAIDAGAGIN.value();
+		this.statushistory = addStatusHistory(this.statushistory, uu, this.status);
+	}
+
 	/**
 	 * Sets status order take.
 	 *

+ 24 - 0
src/main/java/com/uas/platform/b2c/trade/order/model/OrderSimpleInfo.java

@@ -1,6 +1,7 @@
 package com.uas.platform.b2c.trade.order.model;
 
 import java.io.Serializable;
+import java.text.SimpleDateFormat;
 import java.util.Date;
 
 /**
@@ -11,6 +12,8 @@ import java.util.Date;
  */
 public class OrderSimpleInfo extends Document implements Serializable {
 
+	private final static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
 	/**
 	 * 
 	 */
@@ -74,6 +77,11 @@ public class OrderSimpleInfo extends Document implements Serializable {
 	 */
 	private String currencyName;
 
+	/**
+	 * 卖方企业名称
+	 */
+	private String sellername;
+
 	/**
 	 * 价格,存储的为元
 	 */
@@ -287,6 +295,14 @@ public class OrderSimpleInfo extends Document implements Serializable {
 		this.type = type;
 	}
 
+	public String getSellername() {
+		return sellername;
+	}
+
+	public void setSellername(String sellername) {
+		this.sellername = sellername;
+	}
+
 	/**
 	 * Gets paytype.
 	 *
@@ -346,6 +362,7 @@ public class OrderSimpleInfo extends Document implements Serializable {
 		this.price = order.getPrice();
 		this.ensurePrice = order.getEnsurePrice();
 		this.paytype = order.getPaytype();
+		this.sellername = order.getSellername();
 	}
 
 	@Override
@@ -354,5 +371,12 @@ public class OrderSimpleInfo extends Document implements Serializable {
 				+ ", status=" + status + ", price=" + price + ", type=" + type + "]";
 	}
 
+	/**
+	 * 格式化付款时间
+	 * @return
+	 */
+	public String formatTime(){
+		return sdf.format(paytime);
+	}
 	
 }

+ 84 - 0
src/main/java/com/uas/platform/b2c/trade/order/model/PayRecord.java

@@ -0,0 +1,84 @@
+package com.uas.platform.b2c.trade.order.model;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 付款记录类
+ *
+ * @author hulh 2017年10月25日
+ */
+public class PayRecord implements Comparable<PayRecord>{
+
+	private static int counter = 0;
+
+	/**
+	 * 只是为了记录唯一标识
+	 */
+	private final static int id = counter++;
+
+	/**
+	 * 订单号
+	 */
+	private String orderId;
+
+	/**
+	 * 付款时间
+	 */
+	private Date payTime;
+
+	/**
+	 * 付款名称
+	 */
+	private String payName;
+
+	/**
+	 * 付款企业名称
+	 */
+	private String payEnName;
+
+	/**
+	 * 收款企业名称
+	 */
+	private String collectName;
+
+	/**
+	 * 币种 --RMB和USD
+	 */
+	private String currencyName;
+
+	/**
+	 * 支付类型
+	 * TODO 暂时只区分线上和线下
+	 */
+	private Integer payType;
+
+	/**
+	 * 涉及到的金额
+	 */
+	private Double price;
+
+	/**
+	 * 支出还是收入 0-支出,1-收入
+	 */
+	private Short isAdd;
+
+	/**
+	 * 相关的支付记录
+	 */
+	private List<PayRecord> relatedPay;
+
+	@Override
+	public int compareTo(PayRecord o) {
+		return payTime.getTime() > o.getPayTime().getTime() ? 1 :
+				payTime.getTime() == o.getPayTime().getTime() ? 0 : -1;
+	}
+
+	public Date getPayTime() {
+		return payTime;
+	}
+
+	public void setPayTime(Date payTime) {
+		this.payTime = payTime;
+	}
+}

+ 49 - 1
src/main/java/com/uas/platform/b2c/trade/order/model/Purchase.java

@@ -2,6 +2,7 @@ package com.uas.platform.b2c.trade.order.model;
 
 import com.uas.platform.b2c.core.utils.DateFormatUtils;
 import com.uas.platform.b2c.core.utils.DoubleArith;
+import com.uas.platform.b2c.fa.payment.model.Installment;
 import com.uas.platform.b2c.trade.aftersale.model.AfterSaleStatus;
 import com.uas.platform.core.exception.IllegalStatusException;
 import com.uas.platform.core.model.Status;
@@ -21,6 +22,7 @@ import javax.persistence.OneToMany;
 import javax.persistence.OrderBy;
 import javax.persistence.Table;
 import javax.persistence.Transient;
+import javax.persistence.*;
 import java.io.Serializable;
 import java.util.Date;
 import java.util.HashSet;
@@ -482,7 +484,7 @@ public class Purchase extends Document implements Serializable {
 	 */
 	@Column(name = "pu_fare")
 	private Double fare;
-	
+
 	/*
 	 * 自己送货的送货人
 	 */
@@ -519,6 +521,18 @@ public class Purchase extends Document implements Serializable {
 	@Column(name = "in_sd_addr", length = 2000)
 	private String jsonSdAddress;
 
+	/**
+	 * 分期信息id
+	 */
+	@Column(name = "pu_installmentid")
+	private Long installmentId;
+
+	/**
+	 * 分期信息(不做关联)
+	 */
+	@Transient
+	private Installment installment;
+
     /** 异常相关字段end
      *******************************************************************************/
 
@@ -696,6 +710,24 @@ public class Purchase extends Document implements Serializable {
 		this.statushistory = addStatusHistory(this.statushistory, uu, this.status);
 	}
 
+	/**
+	 * 卖家确认分期付款(未完全付完)
+	 * @param uu
+	 */
+	public void setStatusToBePaidAgain(Long uu) {
+		this.status = com.uas.platform.b2c.core.constant.Status.TOBEPAIDAGAGIN.value();
+		this.statushistory = addStatusHistory(this.statushistory, uu, this.status);
+	}
+
+	/**
+	 * 卖家申请取消订单(未完全付完)
+	 * @param uu
+	 */
+	public void setStatusCancelToBeConfirmed(Long uu) {
+		this.status = com.uas.platform.b2c.core.constant.Status.CANCELTOBECONFIRMED.value();
+		this.statushistory = addStatusHistory(this.statushistory, uu, this.status);
+	}
+
 	/**
 	 * Sets status comfirm disagree.
 	 *
@@ -2157,6 +2189,22 @@ public class Purchase extends Document implements Serializable {
 		return this;
 	}
 
+	public Long getInstallmentId() {
+		return installmentId;
+	}
+
+	public void setInstallmentId(Long installmentId) {
+		this.installmentId = installmentId;
+	}
+
+	public Installment getInstallment() {
+		return installment;
+	}
+
+	public void setInstallment(Installment installment) {
+		this.installment = installment;
+	}
+
 	/**
 	 * 采购单的退货状态
 	 */

+ 18 - 0
src/main/java/com/uas/platform/b2c/trade/order/model/PurchaseDetail.java

@@ -1261,6 +1261,15 @@ public class PurchaseDetail extends Document {
 		this.statushistory = addStatusHistory(this.statushistory, uu, this.status);
 	}
 
+	/**
+	 * 卖家申请取消订单(未完全付完)
+	 * @param uu
+	 */
+	public void setStatusCancelToBeConfirmed(Long uu) {
+		this.status = com.uas.platform.b2c.core.constant.Status.CANCELTOBECONFIRMED.value();
+		this.statushistory = addStatusHistory(this.statushistory, uu, this.status);
+	}
+
 	/**
 	 * Sets status unavailable return.
 	 *
@@ -1333,6 +1342,15 @@ public class PurchaseDetail extends Document {
 		this.statushistory = addStatusHistory(this.statushistory, uu, this.status);
 	}
 
+	/**
+	 * 卖家确认分期付款(未完全付完)
+	 * @param uu
+	 */
+	public void setStatusToBePaidAgain(Long uu) {
+		this.status = com.uas.platform.b2c.core.constant.Status.TOBEPAIDAGAGIN.value();
+		this.statushistory = addStatusHistory(this.statushistory, uu, this.status);
+	}
+
 	/**
 	 * 售后中(只能单次单次的售后,暂时先这么处理)
 	 *

+ 45 - 0
src/main/java/com/uas/platform/b2c/trade/order/service/OrderService.java

@@ -245,6 +245,14 @@ public interface OrderService {
 	 */
 	Order ensurePayed(String orderid, Integer type, Long... param);
 
+	/**
+	 * Send message.
+	 *
+	 * @param purchase the purchase
+	 * @throws RuntimeException the runtime exception
+	 */
+	void sendMessage(com.uas.platform.b2c.trade.order.model.Purchase purchase);
+
 	/**
 	 * 批量确认收款
 	 *
@@ -397,6 +405,20 @@ public interface OrderService {
 	 */
 	String releaseOrder(String orderid, String reason);
 
+	/**
+	 * 买家同意卖家发起的取消订单申请
+	 * @param orderid 订单号
+	 * @return
+	 */
+	String aduitReleaseOrder(String orderid);
+
+	/**
+	 * 买家不同意卖家发起的取消订单申请
+	 * @param orderid 订单号
+	 * @return
+	 */
+	String unaduitReleaseOrder(String orderid);
+
 	/**
 	 * 失效订单 (因确认是订单批次库存不足)
 	 *
@@ -591,6 +613,29 @@ public interface OrderService {
 	 */
 	ResultMap getBuyPayRecord(PageParams params);
 
+	/**
+	 * 分页获取买家的支付记录
+	 * @param params
+	 * @param keyword
+	 * @param fromDate
+	 * @param toDate
+	 * @return
+	 */
+	Page<OrderSimpleInfo> getBuyerPayRecord(PageParams params, String keyword, Long fromDate, Long toDate,
+											String currencyName, Integer method);
+
+	/**
+	 * 获取导出的支付记录数据
+	 * @param keyword
+	 * @param fromDate
+	 * @param toDate
+	 * @param currencyName
+	 * @param method
+	 * @return
+	 */
+	List<OrderSimpleInfo> getExportData(String keyword, Long fromDate, Long toDate,
+										String currencyName, Integer method);
+
 	/**
 	 * 根据订单单号修改订单使用状态
 	 * @param orderid

+ 13 - 3
src/main/java/com/uas/platform/b2c/trade/order/service/PurchaseService.java

@@ -91,12 +91,13 @@ public interface PurchaseService {
 	Purchase ensuerAccept(Long puid);
 
 	/**
-	 * 确认付款,录用转账信息
+	 * 确认付款(卖家直接确认)
 	 *
-	 * @param id the id
+	 * @param id 采购单id
+	 * @param installmentDetailId 分期id
 	 * @return purchase
 	 */
-	Purchase ensurePaid(Long id);
+	Purchase ensurePaid(Long id, Long installmentDetailId);
 
 	/**
 	 * 根据id获取采购单
@@ -412,5 +413,14 @@ public interface PurchaseService {
 	 */
 	Logistics findByLgtId(Long lgtId);
 
+	/**
+	 * 卖家取消订单,释放库存
+	 *
+	 * @param purchaseId the purchaseId
+	 * @param reason 取消原因
+	 * @return string string
+	 */
+	String release(String purchaseId, String reason);
+
 	Logistics modifyPurchaseLogistics(Long id);
 }

+ 212 - 10
src/main/java/com/uas/platform/b2c/trade/order/service/impl/OrderServiceImpl.java

@@ -1,6 +1,5 @@
 package com.uas.platform.b2c.trade.order.service.impl;
 
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.uas.api.b2c_erp.buyer.model.B2cOrder;
@@ -20,7 +19,11 @@ import com.uas.platform.b2c.core.utils.DoubleArith;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.b2c.core.utils.NumberUtil;
 import com.uas.platform.b2c.fa.payment.dao.BankTransferDao;
+import com.uas.platform.b2c.fa.payment.dao.InstallmentDao;
+import com.uas.platform.b2c.fa.payment.dao.InstallmentDetailDao;
 import com.uas.platform.b2c.fa.payment.model.BankTransfer;
+import com.uas.platform.b2c.fa.payment.model.Installment;
+import com.uas.platform.b2c.fa.payment.model.InstallmentDetail;
 import com.uas.platform.b2c.fa.payment.service.BankInfoService;
 import com.uas.platform.b2c.fa.settlement.dao.BillDao;
 import com.uas.platform.b2c.fa.settlement.dao.BillInfoDao;
@@ -187,6 +190,10 @@ public class OrderServiceImpl implements OrderService {
     private StoreInDao storeInDao;
     @Autowired
     private SendMessageService sendMessageService;
+    @Autowired
+    private InstallmentDao installmentDao;
+    @Autowired
+    private InstallmentDetailDao installmentDetailDao;
 
     /**
      * 保存订单信息
@@ -1294,7 +1301,17 @@ public class OrderServiceImpl implements OrderService {
     public List<Order> findOnesByOrderId(String[] orderids) {
         List<Order> orders = new ArrayList<>();
         for (String id : orderids) {
-            orders.add(orderDao.findByOrderid(id));
+            Order order = orderDao.findByOrderid(id);
+            //买家中心--采购单详情页 增加分期付款信息
+            Long installmentId = order.getInstallmentId();
+            if (installmentId != null) {
+                Installment installment = installmentDao.findOne(installmentId);
+                if (installment == null) {
+                    throw new IllegalOperatorException( "订单:" + order.getOrderid() + "分期信息有误,请重新确认或联系客服" );
+                }
+                order.setInstallment(installment);
+            }
+            orders.add(order);
         }
         return orders;
     }
@@ -1346,6 +1363,13 @@ public class OrderServiceImpl implements OrderService {
     @Transactional
     public Order ensurePayed(String orderid, Integer type, Long... param) {
         Order order = orderDao.findByOrderid(orderid);
+        if (order == null)
+            throw new IllegalOperatorException("此订单不存在,请重新确认订单信息");
+
+        // 分期付款目前只支持直接付款给卖家
+        if (order.getInstallmentId() != null)
+            throw new IllegalOperatorException("此订单为直接付款给卖家,平台不可确认收款,请重新确认订单信息");
+
         if (order.getStatus().intValue() != Status.PAID.value()
                 && order.getStatus().intValue() != Status.TOBEPAID.value()) {
             throw new IllegalOperatorException(
@@ -1419,12 +1443,13 @@ public class OrderServiceImpl implements OrderService {
         return newOrder;
     }
 
-	/**
-	 * Send message.
-	 *
-	 * @param purchase the purchase
-	 * @throws RuntimeException the runtime exception
-	 */
+    /**
+     * Send message.
+     *
+     * @param purchase the purchase
+     * @throws RuntimeException the runtime exception
+     */
+	@Override
 	public void sendMessage(Purchase purchase) throws RuntimeException{
         if (purchase == null) {
             return;
@@ -1603,6 +1628,15 @@ public class OrderServiceImpl implements OrderService {
     @Override
     public Order buyerOrderDetail(String orderid) {
         Order order = orderDao.findOrderByOrderid(orderid);
+        //买家中心--订单详情页 增加分期付款信息
+        Long installmentId = order.getInstallmentId();
+        if (installmentId != null) {
+            Installment installment = installmentDao.findOne(installmentId);
+            if (installment == null) {
+                throw new IllegalOperatorException("订单:" + order.getOrderid() + "分期信息有误,请重新确认或联系客服");
+            }
+            order.setInstallment(installment);
+        }
         Set<OrderDetail> orderDetails = order.getOrderDetails();
         for (OrderDetail orderDetail : orderDetails) {
             Goods goods = goodsService.findGoodsByBatchCode(orderDetail.getBatchCode());
@@ -1851,6 +1885,13 @@ public class OrderServiceImpl implements OrderService {
         }, pageInfo);
         for (Order order : orderPage.getContent()) {
             order.setSelfSell(!order.getStoreid().equals(sysConf.getStoreid()));
+            if (order.getInstallmentId() != null) {
+                Installment installment = installmentDao.findOne(order.getInstallmentId());
+                if (installment == null) {
+                    throw new IllegalOperatorException("订单:" + order.getOrderid() + "分期信息不存在,请重新确认订单信息");
+                }
+                order.setInstallment(installment);
+            }
         }
         return orderPage;
     }
@@ -1968,6 +2009,18 @@ public class OrderServiceImpl implements OrderService {
             order.setPuExInfoMapToJson(puExInfoMap);
         }
 
+        //买家中心--订单中心 增加分期付款信息
+        for (Order order : pageOrders) {
+            Long installmentId = order.getInstallmentId();
+            if (installmentId != null) {
+                Installment installment = installmentDao.findOne(installmentId);
+                if (installment == null) {
+                    throw new IllegalOperatorException("订单:" + order.getOrderid() + "分期信息有误,请重新确认或联系客服");
+                }
+                order.setInstallment(installment);
+            }
+        }
+
         modelMap.addAttribute("content", pageOrders.getContent());
         modelMap.addAttribute("totalElements", pageOrders.getTotalElements());
         modelMap.addAttribute("totalPages", pageOrders.getTotalPages());
@@ -2141,6 +2194,71 @@ public class OrderServiceImpl implements OrderService {
         return orderPage;
     }
 
+    @Override
+    public String unaduitReleaseOrder(String orderid) {
+        Order order = orderDao.findByOrderid(orderid);
+        List<Purchase> purchase = purchaseDao.findByOrderid(orderid);
+        if (purchase == null)
+            throw new IllegalOperatorException("此订单不存在");
+        if (order == null) {
+            throw new IllegalOperatorException("此订单不存在");
+        }
+
+        if (order.getInstallmentId() == null) {
+            throw new IllegalOperatorException("此订单付款方式非直接付款给卖家,您无法取消,请重新确认订单信息");
+        }
+        Installment installment = installmentDao.findOne(order.getInstallmentId());
+        if (installment == null) {
+            throw new IllegalOperatorException("订单:" + order.getOrderid() + "分期信息有误,请重新确认或联系客服");
+        }
+
+        Long uu = SystemSession.getUser().getUserUU();
+        Set<OrderDetail> orderDetails = order.getOrderDetails();
+        for (OrderDetail orderDetail : orderDetails) {
+            if (orderDetail.getStatus().equals(com.uas.platform.b2c.core.constant.Status.CANCELTOBECONFIRMED.value())) {
+                InstallmentDetail installmentDetail = installmentDetailDao.findByInstallmentIdAndDetno(installment.getId(), installment.getCurrentNo().shortValue());
+                if (com.uas.platform.b2c.core.constant.Status.PAID.value() == installmentDetail.getStatus().intValue()) {
+                    order.setStatusPaid(uu);
+                    orderDetail.setStatusPaid(uu);
+                }
+
+                if (com.uas.platform.b2c.core.constant.Status.MONEYRECEIVED.value() == installmentDetail.getStatus().intValue()) {
+                    order.setStatusToBePaidAgain(uu);
+                    orderDetail.setStatusToBePaidAgain(uu);
+                }
+
+                if (com.uas.platform.b2c.core.constant.Status.TOBEPAID.value() == installmentDetail.getStatus().intValue()) {
+                    order.setStatusToBePaidAgain(uu);
+                    orderDetail.setStatusToBePaidAgain(uu);
+                }
+
+            }
+        }
+
+        for (Purchase purchase1 : purchase) {
+            int puStatus = purchase1.getStatus().intValue();
+            purchase1.setStatusToBePaidAgain(uu);
+            for (PurchaseDetail detail : purchase1.getPurchaseDetails()) {
+                if (puStatus == detail.getStatus().intValue()) {
+                    detail.setStatusToBePaidAgain(uu);
+                }
+            }
+        }
+
+        purchaseDao.save(purchase);
+        orderDao.save(order);
+        return "success";
+    }
+
+    @Override
+    public String aduitReleaseOrder(String orderid) {
+        Order order = orderDao.findByOrderid(orderid);
+        if (order == null) {
+            throw new IllegalOperatorException("此订单不存在");
+        }
+        return releaseOrder(orderid, order.getUnavailableReason());
+    }
+
     /**
      * 取消订单,释放库存
      *
@@ -2156,10 +2274,17 @@ public class OrderServiceImpl implements OrderService {
             throw new IllegalOperatorException("此订单不存在");
         }
         Set<Integer> status = new HashSet<>();
-        Collections.addAll(status, Status.TOBECONFIRMED.value(), Status.TOBEPAID.value(), Status.CONFIRMED.value());
+        Collections.addAll(status, Status.TOBECONFIRMED.value(), Status.TOBEPAID.value(), Status.CONFIRMED.value(), com.uas.platform.b2c.core.constant.Status.TOBEPAIDAGAGIN.value(), com.uas.platform.b2c.core.constant.Status.PAID.value(), com.uas.platform.b2c.core.constant.Status.CANCELTOBECONFIRMED.value());
         if (!status.contains(order.getStatus())) {
             throw new IllegalOperatorException("此订单已付款,不可取消订单");
         }
+        // 买家取消订单验证
+        if (order.getInstallmentId() != null) {
+            Installment installment = installmentDao.findOne(order.getInstallmentId());
+            if (installment == null) {
+                throw new IllegalOperatorException("此订单分期信息有误,请重新确认订单信息");
+            }
+        }
         Set<String> uuids = new HashSet<>();
         Long uu = SystemSession.getUser().getUserUU();
         order.setStatusUnAvailablePersonal(uu);
@@ -2197,7 +2322,6 @@ public class OrderServiceImpl implements OrderService {
         return "success";
     }
 
-
     // TODO 查询接口 支持类型 :现货
     @Override
     public ModelMap findUserVenderByCode(String orderid) {
@@ -3094,6 +3218,84 @@ public class OrderServiceImpl implements OrderService {
         return ResultMap.success(new PageImpl<OrderSimpleInfo>(list, info.getPageable(), orders.getTotalElements()));
     }
 
+    @Override
+    public Page<OrderSimpleInfo> getBuyerPayRecord(com.uas.platform.core.model.PageParams params, String keyword, Long fromDate, Long toDate,
+                                                   String currencyName, Integer method) {
+        final PageInfo info = new PageInfo(params);
+        filterPageInfo(info, keyword, fromDate, toDate, currencyName, method);
+
+        Page<Order> orderPage = orderDao.findAll(new Specification<Order>() {
+            @Override
+            public Predicate toPredicate(Root<Order> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
+                query.where(info.getPredicates(root, query, cb));
+                return null;
+            }
+        }, info);
+        List<OrderSimpleInfo> list = new ArrayList<>();
+        if(orderPage != null) {
+            for (Order order : orderPage.getContent()) {
+                list.add(new OrderSimpleInfo(order));
+            }
+        }
+        return new PageImpl<>(list, info.getPageable(), orderPage.getTotalElements());
+    }
+
+    @Override
+    public List<OrderSimpleInfo> getExportData(String keyword, Long fromDate, Long toDate, String currencyName, Integer method) {
+        final PageInfo info = new PageInfo();
+        filterPageInfo(info, keyword, fromDate, toDate, currencyName, method);
+        List<Order> orderList = orderDao.findAll(new Specification<Order>() {
+            @Override
+            public Predicate toPredicate(Root<Order> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
+                criteriaQuery.where(info.getPredicates(root, criteriaQuery, criteriaBuilder));
+                return null;
+            }
+        });
+        List<OrderSimpleInfo> list = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(orderList)){
+            for (Order order : orderList){
+                OrderSimpleInfo or = new OrderSimpleInfo(order);
+                list.add(or);
+            }
+        }
+
+        return list;
+    }
+
+    /**
+     * 设置分页过滤条件
+     */
+    private void filterPageInfo(PageInfo info, String keyword, Long fromDate, Long toDate,
+                               String currencyName, Integer method){
+
+        info.filter("buyeruu", SystemSession.getUser().getUserUU());
+        if (SystemSession.getUser().getEnterprise() != null) {
+            info.filter("buyerenuu", SystemSession.getUser().getEnterprise().getUu());
+        } else {
+            info.filter("dissociative", Type.PERSONAL.value());
+        }
+        info.expression(PredicateUtils.isNotNull("paytime"));
+        if (StringUtils.hasText(keyword)){
+            SimpleExpression[] simpArrs = new SimpleExpression[2];
+            simpArrs[0] = new SimpleExpression("orderid", keyword, Operator.LIKE, true);
+            simpArrs[1] = new SimpleExpression("sellername", keyword, Operator.LIKE, true);
+            LogicalExpression logical = new LogicalExpression(simpArrs, Operator.OR);
+            info.expression(logical);
+        }
+        if (fromDate != null) {
+            info.expression(PredicateUtils.gte("paytime", new Date(fromDate), false));
+        }
+        if (toDate != null) {
+            info.expression(PredicateUtils.lte("paytime", new Date(toDate), false));
+        }
+        if (currencyName != null){
+            info.expression(PredicateUtils.eq("currency", currencyName, false));
+        }
+        if (method != null){
+            info.expression(PredicateUtils.eq("paytype", method, false));
+        }
+    }
+
     /**
      * 根据订单号修改订单的使用状态
      * @param orderid

+ 283 - 32
src/main/java/com/uas/platform/b2c/trade/order/service/impl/PurchaseServiceImpl.java

@@ -15,6 +15,11 @@ import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.support.log.TradeBufferedLogger;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.b2c.core.utils.NumberUtil;
+import com.uas.platform.b2c.fa.payment.dao.InstallmentDao;
+import com.uas.platform.b2c.fa.payment.dao.InstallmentDetailDao;
+import com.uas.platform.b2c.fa.payment.model.Installment;
+import com.uas.platform.b2c.fa.payment.model.InstallmentDetail;
+import com.uas.platform.b2c.fa.payment.service.InstallmentService;
 import com.uas.platform.b2c.fa.settlement.dao.BillDao;
 import com.uas.platform.b2c.fa.settlement.dao.BillInfoDao;
 import com.uas.platform.b2c.fa.settlement.model.Bill;
@@ -32,16 +37,8 @@ import com.uas.platform.b2c.prod.product.common.service.CreateNumberService;
 import com.uas.platform.b2c.prod.store.dao.StoreInDao;
 import com.uas.platform.b2c.prod.store.model.StoreIn;
 import com.uas.platform.b2c.trade.aftersale.model.AfterSaleStatus;
-import com.uas.platform.b2c.trade.order.dao.OrderDao;
-import com.uas.platform.b2c.trade.order.dao.OrderDetailDao;
-import com.uas.platform.b2c.trade.order.dao.PurchaseDao;
-import com.uas.platform.b2c.trade.order.dao.PurchaseDetailDao;
-import com.uas.platform.b2c.trade.order.dao.PurchaseModifyingHistoryDao;
-import com.uas.platform.b2c.trade.order.model.Order;
-import com.uas.platform.b2c.trade.order.model.OrderDetail;
-import com.uas.platform.b2c.trade.order.model.Purchase;
-import com.uas.platform.b2c.trade.order.model.PurchaseDetail;
-import com.uas.platform.b2c.trade.order.model.PurchaseModifyingHistory;
+import com.uas.platform.b2c.trade.order.dao.*;
+import com.uas.platform.b2c.trade.order.model.*;
 import com.uas.platform.b2c.trade.order.service.OrderService;
 import com.uas.platform.b2c.trade.order.service.PurchaseDetailService;
 import com.uas.platform.b2c.trade.order.service.PurchaseService;
@@ -74,15 +71,7 @@ import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
 
 import static com.uas.platform.b2c.trade.util.Preconditions.checkArgument;
 import static com.uas.platform.b2c.trade.util.Preconditions.checkNotNull;
@@ -153,6 +142,12 @@ public class PurchaseServiceImpl implements PurchaseService {
     private PurchaseModifyingHistoryDao purchaseModifyingHistoryDao;
 	@Autowired
 	private LogisticsDao logisticsDao;
+	@Autowired
+	private InstallmentDao installmentDao;
+    @Autowired
+    private InstallmentDetailDao installmentDetailDao;
+	@Autowired
+	private InstallmentService installmentService;
 
 	@Override
 	public Purchase save(Purchase purchase) {
@@ -624,19 +619,128 @@ public class PurchaseServiceImpl implements PurchaseService {
 	}
 
 	@Override
-	public Purchase ensurePaid(Long id) {
-		// TODO 这里需要前台加入录用银行转账信息
+	public Purchase ensurePaid(Long id, Long installmentDetailId) {
 		Purchase purchase = purchaseDao.findOne(id);
-		if (!purchase.getStatus().equals(Status.TOBEPAID.value())) {
-			throw new IllegalAccessError("采购单不为待付款状态,不能确认付款");
-		}
-		Long uu = SystemSession.getUser().getUserUU();
-		// 关联卖家出货单改为已收款
-		InvoiceFPurchase iFpurchase = invoiceFPurchaseDao.findByInvoiceid(purchase.getInid());
-		iFpurchase.setStatusMoneyreceived(uu);
-		purchase.setPaid(uu);
-		invoiceFPurchaseDao.save(iFpurchase);
-		return purchaseDao.save(purchase);
+		if (purchase == null)
+			throw new IllegalOperatorException("此订单不存在,请重新确认订单信息");
+        Order order = orderDao.findByOrderid(purchase.getOrderid());
+        if (order == null)
+            throw new IllegalOperatorException("此订单不存在,请重新确认订单信息");
+
+        // 分期付款目前只支持直接付款给卖家
+        if (order.getInstallmentId() == null)
+            throw new IllegalOperatorException("此订单为向平台付款,您不可确认收款,请重新确认订单信息");
+
+        if (order.getStatus().intValue() != Status.PAID.value()
+                && order.getStatus().intValue() != Status.TOBEPAID.value()) {
+            throw new IllegalOperatorException(
+                    "订单" + order.getOrderid() + "的状态是" + Status.valueOf(order.getStatus()).getPhrase() + ",不能确认收款");
+        }
+
+        InstallmentDetail installmentDetail = installmentDetailDao.findOne(installmentDetailId);
+
+        if (installmentDetail == null)
+            throw new IllegalOperatorException("对应分期信息不存在,请重新确认分期信息");
+        Installment installment = installmentDetail.getInstallment();
+        if (!installment.getId().equals(purchase.getInstallmentId()))
+            throw new IllegalOperatorException("此订单与此分期信息不符,请重新确认订单信息");
+        if (com.uas.platform.b2c.core.constant.Status.PAID.value() != installment.getStatus().intValue())
+            throw new IllegalOperatorException("此订单分期不为待确认付款状态,请重新确认分期信息");
+        if (!installment.getCurrentNo().equals(installmentDetail.getDetno()))
+            throw new IllegalOperatorException("此次付款分期与应付分期信息不符,请重新确认分期信息");
+        if (com.uas.platform.b2c.core.constant.Status.PAID.value() != installmentDetail.getStatus().intValue())
+            throw new IllegalOperatorException("此次分期不为待确认付款状态,请重新确认分期信息");
+
+        installmentDetail.setStatus(com.uas.platform.b2c.core.constant.Status.MONEYRECEIVED.value());
+        installmentDetail.setEnsureDate(new Date());
+
+        Boolean isReceived = false;
+        if (installmentDetail.getDetno().equals(installment.getCount().shortValue())) {
+            installment.setStatus(com.uas.platform.b2c.core.constant.Status.MONEYRECEIVED.value());
+            isReceived = true;
+        } else {
+            installment.setCurrentNo((short) (installment.getCurrentNo() + 1));
+        }
+
+        Long userUU = SystemSession.getUser().getUserUU();
+
+        order.setPaytype(Type.Payment_CompanyTransfer_Code.value());
+        Set<OrderDetail> orderDetails = order.getOrderDetails();
+        for (OrderDetail orderDetail : orderDetails) {
+            Goods goods = goodsDao.findByBatchCode(orderDetail.getBatchCode());
+            // 更新改订单涉及批次的上次更新时间,以延长批次有效期
+            if (goods != null) {
+                if (goods.getSourceId() == null) {
+                    goodsService.updateAvailableDays(goods, GoodsHistory.OperateType.OrderPaied, userUU);
+                }
+            }
+            // 修改明细的状态,设置为等待卖家同意
+            if ((orderDetail.getStatus().intValue() == Status.PAID.value()) || (orderDetail.getStatus().intValue() == Status.TOBEPAID.value()) || (orderDetail.getStatus() == com.uas.platform.b2c.core.constant.Status.TOBEPAIDAGAGIN.value())) {
+                if (isReceived) {
+                    orderDetail.setStatusMonecyReceviced(userUU);
+                } else {
+                    orderDetail.setStatusToBePaidAgain(userUU);
+                }
+            } else if ((orderDetail.getStatus().intValue() != Status.UNAVAILABLE_DISAGREE.value()) && (orderDetail.getStatus().intValue() != Status.TOBEREFUNDED.value())
+                    && (orderDetail.getStatus().intValue() != Status.UNAVAILABLE_PERSONAL.value())) {
+                throw new IllegalOperatorException("当前的订单存在明细行状态不正常:" + orderDetail.getDetailid() + " 状态是"
+                        + Status.valueOf(orderDetail.getStatus()).getPhrase());
+            }
+        }
+
+        // 设置为等待卖家同意
+        if (isReceived) {
+            order.setStatusMonecyReceviced(userUU);
+        } else {
+            order.setStatusToBePaidAgain(userUU);
+        }
+
+        order.setPaytime(new Date());
+        Order newOrder = orderDao.save(order);
+
+        ArrayList<Integer> statusList = new ArrayList<>();
+        Collections.addAll(statusList, Status.TOBECONFIRMED.value(), Status.PAID.value(), com.uas.platform.b2c.core.constant.Status.TOBEPAIDAGAGIN.value());
+
+        if (statusList.contains(purchase.getStatus())) {
+            if (isReceived) {
+                purchase.setStatusComfirmed(userUU);
+            } else {
+                purchase.setStatusToBePaidAgain(userUU);
+            }
+
+            // 设置明细的状态
+            Set<PurchaseDetail> purchaseDetails = purchase.getPurchaseDetails();
+            for (PurchaseDetail purchaseDetail : purchaseDetails) {
+                if (statusList.contains(purchaseDetail.getStatus())) {
+                    if (isReceived) {
+                        purchaseDetail.setStatusComfirmed(userUU);
+                    } else {
+                        purchaseDetail.setStatusToBePaidAgain(userUU);
+                    }
+                } else if ((purchaseDetail.getStatus().intValue() != Status.UNAVAILABLE_DISAGREE.value())
+                        && (purchaseDetail.getStatus().intValue() != Status.UNAVAILABLE_PERSONAL.value())) {
+                    throw new IllegalOperatorException("存在采购单明细状态异常:" + purchaseDetail.getDetailid() + ", 状态是:"
+                            + Status.valueOf(purchaseDetail.getStatus()).getPhrase());
+                }
+            }
+
+            purchase.setSendstatus(Status.NOT_UPLOAD.value());
+            purchaseDao.save(purchase);
+            //发送短信,异常不作处理
+			if (purchase.getInstallmentId() == null) {
+				try {
+					orderService.sendMessage(purchase);
+				}catch (RuntimeException e){}
+			}
+        } else if ((purchase.getStatus().intValue() != Status.UNAVAILABLE_DISAGREE.value())
+                && (purchase.getStatus().intValue() != Status.UNAVAILABLE_PERSONAL.value())) { // 采购单不在用户取消状态
+            throw new IllegalOperatorException("采购单" + purchase.getPurchaseid() + ", 状态是"
+                    + Status.valueOf(purchase.getStatus()).getPhrase() + ",是异常状态");
+        }
+
+        installmentDetailDao.save(installmentDetail);
+        installmentDao.save(installment);
+        return purchase;
 	}
 
 	@Override
@@ -1089,6 +1193,19 @@ public class PurchaseServiceImpl implements PurchaseService {
 		setExceptionStatus(pageInfo, exceptionType);
 
 		Page<Purchase> purchasePage = getPurchaseByStatus(pageInfo, null, status, isProof);
+
+		//卖家中心--订单中心 增加分期付款信息
+		for (Purchase purchase : purchasePage) {
+			Long installmentId = purchase.getInstallmentId();
+			if (installmentId != null) {
+				Installment installment = installmentDao.findOne(installmentId);
+				if (installment == null) {
+					throw new IllegalOperatorException("订单:" + purchase.getPurchaseid() + "分期信息有误,请重新确认或联系客服");
+				}
+				purchase.setInstallment(installment);
+			}
+		}
+
 		modelMap.put("totalElements", purchasePage.getTotalElements());
 		modelMap.put("totalPages", purchasePage.getTotalPages());
 		modelMap.put("content", purchasePage.getContent());
@@ -1227,6 +1344,15 @@ public class PurchaseServiceImpl implements PurchaseService {
 			return new ResultMap(CodeType.NO_INFO, "采购单编号不能为空");
 		}
 		Purchase purchase = purchaseDao.findByPurchaseid(purchaseId);
+		//卖家中心--采购单详情页 增加分期付款信息
+		Long installmentId = purchase.getInstallmentId();
+		if (installmentId != null) {
+			Installment installment = installmentDao.findOne(installmentId);
+			if (installment == null) {
+				throw new IllegalOperatorException("订单:" + purchase.getPurchaseid() + "分期信息有误,请重新确认或联系客服");
+			}
+			purchase.setInstallment(installment);
+		}
 		Long enUU = SystemSession.getUser().getEnterprise().getUu();
 		if (!Objects.equals(enUU, purchase.getSellerenuu())) {
 			return new ResultMap(CodeType.NOT_PERMIT, "非法获取操作");
@@ -1343,6 +1469,26 @@ public class PurchaseServiceImpl implements PurchaseService {
 
 	@Override
 	public String modifyPurchaseDetailUnitPrice(List<PurchaseModifyingHistory> list){
+		//卖家改价验证
+		if (!CollectionUtils.isEmpty(list)) {
+			PurchaseModifyingHistory purchaseModifyingHistory = list.get(0);
+			PurchaseDetail purchaseDetail = purchaseDetailDao.findByDetailid(purchaseModifyingHistory.getDetailid());
+			Purchase purchase = purchaseDetail.getPurchase();
+			if (purchase != null) {
+				if (purchase.getInstallmentId() != null) {// 验证分期
+					Installment installment = installmentDao.findOne(purchase.getInstallmentId());
+					if (installment != null) {
+						if (com.uas.platform.b2c.core.constant.Status.TOBEPAID.value() != installment.getStatus()) {
+							throw new IllegalOperatorException( "此订单已付款,不可改价" );
+						}
+					} else {
+						throw new IllegalOperatorException( "此订单分期信息有误,请重新确认订单信息" );
+					}
+				}
+			} else {
+				throw new IllegalOperatorException( "此订单不存在,请重新确认订单信息" );
+			}
+		}
 		Iterator<PurchaseModifyingHistory> it = list.iterator();
 		while(it.hasNext()){
 			PurchaseModifyingHistory data = it.next();
@@ -1351,7 +1497,6 @@ public class PurchaseServiceImpl implements PurchaseService {
 			PurchaseDetail purchaseDetail = purchaseDetailDao.findByDetailid(purchaseDetailid);
 			Integer status = purchaseDetail.getStatus();
 			Integer dd = Status.TOBECONFIRMED.value();
-			System.out.println(!purchaseDetail.getStatus().equals(Status.TOBECONFIRMED.value()));
 			if(!purchaseDetail.getStatus().equals(Status.TOBECONFIRMED.value())){
 				throw new IllegalOperatorException("当前状态是:" + Status.valueOf(purchaseDetail.getStatus()).getPhrase() + ",不能修改采购单明细单价");
 			}
@@ -1442,6 +1587,14 @@ public class PurchaseServiceImpl implements PurchaseService {
 			history.setModifyingUnitPrice(modifyingUnitPrice);
 			purchaseModifyingHistoryDao.save(history);
 		}
+
+		if (CollectionUtils.isNotEmpty(list)) {
+			PurchaseModifyingHistory purchaseModifyingHistory = list.get(0);
+			PurchaseDetail purchaseDetail = purchaseDetailDao.findByDetailid(purchaseModifyingHistory.getDetailid());
+			Purchase purchase = purchaseDetail.getPurchase();
+			if (purchase.getInstallmentId() != null)
+				installmentService.updateAfterModifyPurchasePrice(list.get(0).getDetailid());
+		}
 		return "success";
 	}
 
@@ -1460,6 +1613,104 @@ public class PurchaseServiceImpl implements PurchaseService {
 		return logisticsDao.findOne(lgtId);
 	}
 
+	/**
+	 * 卖家取消订单,释放库存
+	 *
+	 * @param purchaseId
+	 * @return string string
+	 */
+	@Transactional
+	@Override
+	public String release(String purchaseId,  String reason) {
+		Purchase purchase = purchaseDao.findByPurchaseid(purchaseId);
+		if (purchase == null)
+			throw new IllegalOperatorException("订单不存在");
+		Order order = orderDao.findByOrderid(purchase.getOrderid());
+		if (order == null) {
+			throw new IllegalOperatorException("此订单不存在");
+		}
+		if (SystemSession.getUser().getEnterprise() == null) {
+			throw new IllegalOperatorException("您的企业信息有误,请重新选择企业");
+		}
+
+		if (purchase.getInstallmentId() == null) {
+			throw new IllegalOperatorException("此订单付款方式非直接付款给卖家,您无法取消,请重新确认订单信息");
+		}
+		Installment installment = installmentDao.findOne(purchase.getInstallmentId());
+		if (installment == null) {
+			throw new IllegalOperatorException("订单:" + order.getOrderid() + "分期信息有误,请重新确认或联系客服");
+		}
+		purchase.setInstallment(installment);
+        if (!SystemSession.getUser().getEnterprise().getUu().equals(purchase.getInstallment().getSellerenuu())) {
+            throw new IllegalOperatorException("该订单不属于当前企业,请重新确认信息");
+        }
+
+		Date sysDate = new Date();
+		Long uu = SystemSession.getUser().getUserUU();
+		InstallmentDetail installmentDetail = installmentDetailDao.findByInstallmentIdAndDetno(installment.getId(), (short) 1);
+		if (sysDate.after(installmentDetail.getDeadline()) || com.uas.platform.b2c.core.constant.Status.PAID.value() == installment.getStatus().intValue()) {// 当前时间已将超过一期的截止时间
+			if (com.uas.platform.b2c.core.constant.Status.TOBEPAID.value() == installment.getStatus().intValue()) {// 买家未付款,直接取消
+				Set<String> uuids = new HashSet<>();
+				order.setStatusUnAvailablePersonal(uu);
+				order.setUnavailableTime(new Date());
+				order.setUnavailableReason(reason);
+				Set<OrderDetail> orderDetails = order.getOrderDetails();
+				for (OrderDetail orderDetail : orderDetails) {
+					if (orderDetail.getStatus().equals(Status.CONFIRMED.value())
+							|| orderDetail.getStatus().equals(Status.TOBEPAID.value())) {
+						uuids.add(orderDetail.getUuid());
+						orderDetail.setStatusUnAvailablePersonal(uu);
+						goodsService.releaseReserve(orderDetail.getBatchCode(), orderDetail.getNumber());
+					}
+				}
+
+				List<Purchase> purchases = purchaseDao.findByOrderid(order.getOrderid());
+				if (!org.springframework.util.CollectionUtils.isEmpty(purchases)) {
+					for (Purchase purchase1: purchases) {
+						int puStatus = purchase1.getStatus().intValue();
+						purchase1.setStatusUnAvailablePersonal(uu);
+						purchase1.setUnavailableTime(new Date());
+						for (PurchaseDetail detail : purchase1.getPurchaseDetails()) {
+							if (puStatus == detail.getStatus().intValue()) {
+								detail.setStatusUnAvailablePersonal(uu);
+								detail.setUnavailableTime(new Date());
+							}
+						}
+					}
+				}
+				purchaseDao.save(purchases);
+				orderDao.save(order);
+				for (String uuid : uuids) {
+					goodsService.updateComponentTradeInfos(uuid);
+				}
+			} else {// 买家已付款,卖家发起取消申请
+				Set<OrderDetail> orderDetails = order.getOrderDetails();
+				order.setStatusCancelToBeConfirmed(uu);
+				order.setUnavailableReason(reason);
+				for (OrderDetail orderDetail : orderDetails) {
+					if (orderDetail.getStatus().equals(com.uas.platform.b2c.core.constant.Status.PAID.value())
+							|| orderDetail.getStatus().equals(com.uas.platform.b2c.core.constant.Status.TOBEPAIDAGAGIN.value())) {
+						orderDetail.setStatusCancelToBeConfirmed(uu);
+					}
+				}
+
+				int puStatus = purchase.getStatus().intValue();
+				purchase.setStatusCancelToBeConfirmed(uu);
+				for (PurchaseDetail detail : purchase.getPurchaseDetails()) {
+					if (puStatus == detail.getStatus().intValue()) {
+						detail.setStatusCancelToBeConfirmed(uu);
+					}
+				}
+				purchaseDao.save(purchase);
+				orderDao.save(order);
+			}
+		} else {
+			throw new IllegalOperatorException("买家未逾期付款,您不可取消");
+		}
+
+		return "success";
+	}
+
 	@Override
 	public Logistics modifyPurchaseLogistics(Long id) {
 		return null;

+ 3 - 3
src/main/resources/dev/jdbc.properties

@@ -1,8 +1,8 @@
 jdbc.driverClassName=com.mysql.jdbc.Driver
 #jdbc.url=jdbc:oracle:thin:@192.168.253.6:1521:orcl
-jdbc.url=jdbc:mysql://192.168.253.12:3306/mall_test_dev?characterEncoding=UTF-8&allowMultiQueries=true&rewriteBatchedStatements=true
-jdbc.username=root
-jdbc.password=select111***
+jdbc.url=7e5ef205e2ff4ca4ac98c9f833880ec6e2fe1a4579ebe6946c98747cbe3897b66b5c4cb4985aa8f22aa1cbab4bc6bfe12e09403e6255e2fda2f113bc366bbfc5d9a2cf99c34ce47ba6bd752a9bf5f04c3faf83464996ab6930a84c7d3b9f62d759eb691bc8cd1fe3225f6e7efa5ab3a583896b06178e65c56c3c4e448a0ae4fe
+jdbc.username=474e1aeadeeecac5
+jdbc.password=48981af937f010627b96e886a0d38aad
 jdbc.initialSize=1
 jdbc.maxActive=100
 jdbc.maxIdle=50

BIN
src/main/resources/jxls-tpl/trade/bankTransfer.xls


BIN
src/main/resources/jxls-tpl/trade/payRecord.xls


+ 3 - 3
src/main/resources/prod/jdbc.properties

@@ -3,9 +3,9 @@
 #jdbc.username=platform$b2b
 #jdbc.password=select*fromuu
 jdbc.driverClassName=com.mysql.jdbc.Driver
-jdbc.url=jdbc:mysql://10.10.0.208:8066/mall_prod?characterEncoding=UTF-8&allowMultiQueries=true&rewriteBatchedStatements=true
-jdbc.username=sa
-jdbc.password=Select123!#%*(
+jdbc.url=7e5ef205e2ff4ca46e29823f9c378880524d69d6c11d8c1c3688f4f0b3712ba1385b2cecff54843db21897fe0c75f0a36c7921cab8fadf398fa33412ca529b7f04233bf4ae6fd3870626fa79ef7f87cb7a8905195ea37bd042b530659d0e82dda7359ee0139e0d6fb23654ba47f5f4b8c682a3c72b9d81e7
+jdbc.username=73f3cd5578b9e08b
+jdbc.password=ee922d9f0e792f87e6dff054a282692d
 jdbc.initialSize=1
 jdbc.maxActive=100
 jdbc.maxIdle=50

+ 1 - 1
src/main/resources/prod/sys.properties

@@ -31,7 +31,7 @@ newsMicroServiceIp=news.usoftchina.com
 newsRedisRefresh=3600
 floorMicroServiceIp=10.10.0.30
 carouselMicroServiceIp=10.10.0.188
-storecmsMicroServiceIp=10.10.0.30s
+storecmsMicroServiceIp=10.10.0.30
 endpointUri=10.10.100.23
 recommendPort=20100
 # upload file

+ 10 - 1
src/main/resources/spring/context.xml

@@ -11,7 +11,15 @@
 	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
 	http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd">
 
-	<context:property-placeholder location="classpath*:${profile}/*.properties" />
+	<bean id="propertyConfigurer"
+		  class="com.uas.platform.b2c.core.support.EncryptablePropertyPlaceholderConfigurer">
+		<property name="locations">
+			<list>
+				<value>classpath*:${profile}/*.properties</value>
+			</list>
+		</property>
+	</bean>
+	<!--<context:property-placeholder location="classpath*:${profile}/*.properties" />-->
 	<!-- 系统运行参数注入 -->
 	<util:properties id="sys"
 		location="classpath:${profile}/sys.properties" />
@@ -23,6 +31,7 @@
 	<!-- 容器启动完成之后执行 -->
 	<bean class="com.uas.platform.b2c.core.support.ContextRefreshedProcessor" />
 
+
 	<context:component-scan base-package="com.uas.platform" />
 	<context:annotation-config />
 

+ 3 - 3
src/main/resources/test/jdbc.properties

@@ -1,8 +1,8 @@
 jdbc.driverClassName=com.mysql.jdbc.Driver
 #jdbc.url=jdbc:oracle:thin:@192.168.253.6:1521:orcl
-jdbc.url=jdbc:mysql://192.168.253.12:3306/mall_test_dev?characterEncoding=UTF-8&allowMultiQueries=true&rewriteBatchedStatements=true
-jdbc.username=root
-jdbc.password=select111***
+jdbc.url=7e5ef205e2ff4ca4ac98c9f833880ec6e2fe1a4579ebe6946c98747cbe3897b66b5c4cb4985aa8f22aa1cbab4bc6bfe12e09403e6255e2fda2f113bc366bbfc5d9a2cf99c34ce47ba6bd752a9bf5f04c3faf83464996ab6930a84c7d3b9f62d759eb691bc8cd1fe3225f6e7efa5ab3a583896b06178e65c56c3c4e448a0ae4fe
+jdbc.username=474e1aeadeeecac5
+jdbc.password=48981af937f010627b96e886a0d38aad
 jdbc.initialSize=1
 jdbc.maxActive=100
 jdbc.maxIdle=50

+ 1 - 0
src/main/webapp/WEB-INF/spring/hessian.xml

@@ -8,6 +8,7 @@
 	<bean id="defaultHandlerMapping"
 		class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
 	<!-- 提供用于验证签名的私钥 -->
+	<!-- 注意保持name 链接规则一直,/api/service/** 否则会被过滤器KeyWordFilter过滤,验证无法通过 -->
 	<bean id="apiSecretKeyService" class="com.uas.platform.b2c.external.erp.support.SecretKeyServiceImpl" />
 	<!-- 验证成功后执行(将用户信息写到SystemSession) -->
 	<bean id="apiHandlerInterceptor"

+ 65 - 3
src/main/webapp/WEB-INF/views/normal/default/404.html

@@ -1,10 +1,72 @@
 <!DOCTYPE HTML>
 <html lang="zh-CN">
 <head>
-<meta charset="utf-8">
-<title>找不到页面</title>
+	<meta charset="utf-8">
+	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+	<meta name="renderer" content="webkit">
+	<title>404-优软商城</title>
+	<meta name="description" content="404" />
+	<meta name="keywords"
+		  content="优软商城,B2B,B2C,行业门户,网上贸易,电子商务,网上贸易,网上交易,交易市场,在线交易,供求信息,采购,求购信息,供应信息" />
+	<link href="static/img/all/u.png" rel="icon" type="image/x-icon" />
+	<link rel="stylesheet" href="static/lib/bootstrap/css/bootstrap.min.css" />
+	<link rel="stylesheet" href="static/lib/angular/ng-table.css" />
+	<link rel="stylesheet" href="static/lib/fontawesome/css/font-awesome.min.css" />
+	<link rel="stylesheet" href="static/lib/iconfont/css/iconfont.css" />
+	<link rel="stylesheet" href="static/lib/jquery/themes/summernote/css/summernote.css" />
+	<link rel="stylesheet" href="static/lib/jquery/themes/uploadify/uploadify.css" />
+	<link rel="stylesheet" href="static/css/vendor/base.css" />
+	<style>
+		.section{
+			background: #ebfdff url('static/img/user/images/404.png')no-repeat center center;
+			height:978px;
+			margin-top:-65px;
+			position:relative;
+		}
+		.section .btn-click{
+			position:absolute;
+			top:54%;
+			left:50%;
+			margin-left:-150px;
+		}
+		.section .btn-click a{
+			display:inline-block;
+			width:130px;
+			height:33px;
+			font-size: 16px;
+			line-height: 33px;
+			color:#fff;
+			background: #f87c29;
+			text-align: center;
+			margin:0 10px;
+			border-radius: 2px;
+			text-decoration: none;
+		}
+	</style>
 </head>
 <body>
-	很遗憾,找不到您请求的页面!
+	<div class="head-top">
+		<div class="container">
+			<div class="wrap">
+				<div class="head-top-left fl"><img src="static/img/user/images/head_top_logo.png" /><a href="http://www.ubtob.com/">进入优软云</a> </div>
+				<div class="head-top-right fr">
+					<a href="/platform-b2c/vendor#/index">卖家中心</a>
+					<a href="/platform-b2c/user#/home">买家中心</a>
+					<a href="#">加入收藏</a>
+					<a href="/platform-b2c/help#/home" target="_blank">帮助中心</a>
+					<a href="http://wpa.qq.com/msgrd?v=3&uin=3432892085&site=www.ubtoc.com&menu=yes">在线客服</a>
+					<span>服务电话:800-830-1818</span>
+				</div>
+			</div>
+		</div>
+	</div>
+	<div class="section">
+		<div class="container">
+			<div class="btn-click">
+				<a href="/"><i class="fa fa-home" style="margin-right:5px;"></i>返回首页</a>
+				<a href="javascript:history.go(-1)"><i class="fa fa-reply" style="margin-right:5px;"></i>返回上一页</a>
+			</div>
+		</div>
+	</div>
 </body>
 </html>

+ 2 - 0
src/main/webapp/WEB-INF/views/normal/user_center.html

@@ -21,6 +21,8 @@
 <link rel="stylesheet" href="static/css/user/user.css" />
 <link rel="stylesheet" href="static/lib/calendar/calendar.css">
 <link rel="stylesheet" type="text/css" href="static/lib/keyboard/css/softkeys-0.0.1.css">
+<link rel="stylesheet" href="static/lib/angular/ng-table.css">
+    <link rel="stylesheet" href="static/css/commonComponent.css" />
 </head>
 <body>
 

+ 7 - 2
src/main/webapp/resources/css/common.css

@@ -413,7 +413,10 @@ input.ng-invalid.ng-dirty,textarea.ng-invalid.ng-dirty {
 
 .modal {
     position: absolute;
-    bottom: auto;
+    top:50%;
+	left:50%;
+	margin-left:-50%;
+	margin-top:-300px;
 }
 
 .modal-backdrop.in {
@@ -943,4 +946,6 @@ input::-webkit-inner-spin-button {
 /*去掉搜狗小键盘样式*/
 input::-webkit-input-safebox-button{
 	display: none;
-}
+}
+/*去除textarea默认右下角可自由放大样式*/
+textarea{resize:none}

+ 621 - 0
src/main/webapp/resources/css/commonComponent.css

@@ -0,0 +1,621 @@
+/*---------------------提示框样式 start---------------------*/
+/*示例:
+<div class="com-del-box">
+    <div class="title">
+        <i></i>
+    </div>
+    <div class="content">
+        <p><i class="fa fa-exclamation-circle"></i>是否要删除此发票?</p>
+        <div>
+            <a>取消</a>
+            <a>确认</a>
+        </div>
+    </div>
+</div>
+*/
+.com-del-box{
+    position: fixed;
+    z-index: 10;
+    height: 152px;
+    opacity: 1;
+    background-color: white;
+    width: 310px;
+    -webkit-box-shadow: 0 5px 15px rgba(0,0,0,.5);
+    box-shadow: 0 5px 15px rgba(0,0,0,.5);
+    margin: -155px 0 0 -75px;
+    top: 55%;
+    left: 50%;
+}
+.com-del-box .title{
+    height: 30px;
+    background-color: #5078cb;
+    text-align: right;
+    padding-right: 15px;
+    line-height: 30px;
+}
+.com-del-box .title i{
+    background: url(../img/icon/close.png) no-repeat;
+    display: inline-block;
+    width: 9px;
+    height: 9px;
+    cursor: pointer;
+    margin: 0;
+}
+.com-del-box .content{
+    width: 100%;
+    text-align: center;
+    margin: 0 auto;
+}
+.com-del-box .content p{
+    line-height: 50px;
+    font-size: 14px;
+    padding-top: 10px;
+}
+.com-del-box .content p i{
+    color: #5078cb;
+    font-size: 16px;
+    margin-right: 10px;
+}
+.com-del-box .content div{
+    width: 100%;
+    text-align: center;
+    margin: 0 auto;
+}
+.com-del-box .content div a{
+    width: 55px;
+    height: 26px;
+    line-height: 26px;
+    display: inline-block;
+    text-align: center;
+    font-size: 14px;
+    cursor: pointer;
+}
+.com-del-box .content div a:first-child{
+    background: #b4b5b9;
+    color: #333;
+    margin-right: 10px;
+}
+.com-del-box .content div a:last-child{
+    background: #5078cb;
+    color: #fff;
+}
+.com-del-box .content div a:hover{
+    background: #3f7ae3;
+    color: #fff;
+}
+/*---------------------提示框样式 end---------------------*/
+
+/*---------------------btn样式 start---------------------*/
+/*示例(size+type):
+<span class="com-btn-level1 com-btn-submit"></span>
+*/
+/*btnSize*/
+.com-btn-level1 {
+    display: inline-block;
+    height: 25px;
+    width:64px;
+    text-align: center;
+    line-height: 23px;
+    font-size: 14px;
+    cursor: pointer;
+    vertical-align: middle;
+}
+.com-btn-level1[disabled] {
+    cursor: not-allowed;
+}
+.com-btn-level2 {
+    display: inline-block;
+    padding: 0 11px;
+    height: 25px;
+    line-height: 23px;
+    border-radius: 2px;
+    font-size: 12px;
+    cursor: pointer;
+    vertical-align: middle;
+}
+.com-btn-level2[disabled] {
+    cursor: not-allowed;
+}
+/*btnType*/
+.com-btn-submit {
+    color: #fff;
+    background: #5078cb;
+    border: 1px solid #5078cb;
+}
+.com-btn-cancel {
+    background: #c8c6c6;
+    color: #fff;
+    border: 1px solid #c8c6c6;
+}
+.com-btn-detail {
+    color: #fff;
+    background: #ff8522;
+    border: 1px solid #ff8522;
+}
+.com-btn-detail-border {
+    color: #ff8522;
+    background: #fff;
+    border: 1px solid #ff8522;
+}
+.com-btn-red {
+    background: #f15601;
+    color: #fff;
+    border: 1px solid #f15601;
+}
+.com-btn-green {
+    background: #33b401;
+    color: #fff;
+    border: 1px solid #33b401;
+}
+.com-btn-submit-border {
+    border: 1px solid #5078cb;
+    background: #fff;
+    color: #5078cb;
+}
+/*---------------------btn样式 end-----------------------*/
+
+/*---------------------标准控件-新增start---------------------*/
+i.fa-plus-circle{
+    font-size: 16px!important;
+    color: #33b401!important;
+}
+/*---------------------标准控件-新增end---------------------*/
+
+/*---------------------标准控件-删除start---------------------*/
+i.fa-minus-circle{
+    font-size: 16px!important;
+    color: #f51c24!important;
+}
+/*---------------------标准控件-删除end---------------------*/
+
+/*---------------------标准控件-单选框start---------------------*/
+/** html代码
+    <label class="com-check-radio">
+        <input type="radio" id="effect" name="radio">
+        <label for="effect"></label>
+        生效
+    </label>
+    <label class="com-check-radio">
+        <input type="radio" id="no-effect" name="radio" checked="checked">
+        <label for="no-effect"></label>
+        暂不生效
+    </label>
+**/
+.com-check-radio input[type='radio']{
+    display: none!important;
+    margin: 7px 8px 0!important;
+}
+.com-check-radio input[type='radio'] + label{
+    position: relative!important;
+    top: 7px!important;
+    margin-right: 5px!important;
+    display: inline-block!important;
+    width: 12px!important;
+    height: 12px!important;
+    font-weight: normal!important;
+    background: url(../img/icon/check-rule.png) no-repeat;
+}
+.com-check-radio label{
+    background-position: 0 0!important;
+}
+.com-check-radio input:checked + label{
+    background-position: -15px 0!important;
+}
+/*---------------------标准控件-单选框end---------------------*/
+
+/*---------------------标准控件-复选框start---------------------*/
+/** html代码
+    <label class="com-check-box">
+        <input type="checkbox" id="1">
+        <label for="1"></label>
+    </label>
+**/
+.com-check-box input {
+    display: none!important;
+}
+.com-check-box input[type="checkbox"] + label{
+    display: inline-block!important ;
+    position: relative!important ;
+    top: 2px!important ;
+    width: 12px!important ;
+    height: 12px!important ;
+    background: url(../img/icon/check-rule.png) no-repeat ;
+    background-position: -48px 0;
+}
+.com-check-box input:checked + label {
+    background-position: -31px 0;
+}
+/*---------------------标准控件-复选框end---------------------*/
+
+/*---------------------标准控件-开关(蓝色)start---------------------*/
+/** html代码
+    <div class="com-switch-blue">
+        <span class="checkbox">
+            <span><em></em></span>
+        </span>
+        <span class="checkbox active">
+            <span><em></em></span>
+        </span>
+	</div>
+**/
+div.com-switch-blue .checkbox {
+    margin: 0 auto;
+    text-align: center;
+    position: relative;
+    display: block;
+}
+div.com-switch-blue .checkbox span {
+    width: 46px;
+    height: 12px;
+    display: inline-block;
+    border-radius: 18px;
+    border: #e4e4e4 1px solid;
+    cursor: pointer;
+    position: relative;
+    box-shadow: 1px 1px 5px #eee;
+    background: -webkit-gradient(linear,0% 0%, 0% 100%, from(#E0E0E0), to(#E8E8E8), color-stop(0.5,#F2F2F2));
+    transition: background-color .1s ease-out;
+}
+div.com-switch-blue .checkbox.active span{
+    background: #b9cffa;
+}
+div.com-switch-blue .checkbox.active span em{
+    left: 34px;
+}
+div.com-switch-blue .checkbox span em{
+    position: absolute;
+    width: 16px;
+    top: -5px;
+    left: 0;
+    height: 16px;
+    line-height: 16px;
+    background-color: #fff;
+    border: #eee 1px solid;
+    border-radius: 50%;
+    box-shadow: -1px 2px 1px #999;
+    transition: background-color .1s ease-out;
+    color: #666;
+    font-size: 12px;
+}
+div.com-switch-blue .checkbox span em:after{
+    content: '';
+    width: 6px;
+    height: 6px;
+    display: inline-block;
+    background: #dedcdc;
+    border-radius: 100%;
+    position: absolute;
+    top: 4px;
+    left: 4px;
+}
+/*---------------------标准控件-开关(蓝色)end---------------------*/
+
+/*---------------------标准控件-开关(绿色)start---------------------*/
+/** html代码
+    <div class="com-switch-green">
+        <span class="checkbox">
+            <span><em></em></span>
+        </span>
+        <span class="checkbox active">
+            <span><em></em></span>
+        </span>
+	</div>
+**/
+div.com-switch-green .checkbox {
+    margin: 0 auto;
+    text-align: center;
+    position: relative;
+    display: block;
+}
+div.com-switch-green .checkbox span {
+    width: 34px;
+    height: 18px;
+    display: inline-block;
+    border-radius: 18px;
+    border: #e4e4e4 1px solid;
+    cursor: pointer;
+    position: relative;
+    box-shadow: 1px 1px 5px #eee;
+    background: -webkit-gradient(linear,0% 0%, 0% 100%, from(#bbbcba), to(#bfc1be), color-stop(0.5,#c5c7c4));
+    transition: background-color .1s ease-out;
+}
+div.com-switch-green .checkbox.active span{
+    background: #3acb14;
+}
+div.com-switch-green .checkbox.active span em{
+    left: 18px;
+}
+div.com-switch-green .checkbox span em{
+    position: absolute;
+    top: -2px;
+    left: -3px;
+    width: 18px;
+    height: 18px;
+    line-height: 18px;
+    background-color: #fff;
+    border: #eee 1px solid;
+    border-radius: 50%;
+    box-shadow: -1px 2px 1px #999;
+    transition: background-color .1s ease-out;
+    color: #666;
+    font-size: 12px;
+}
+div.com-switch-green .checkbox span em:after{
+    content: '';
+    width: 6px;
+    height: 6px;
+    display: inline-block;
+    background: #dedcdc;
+    border-radius: 100%;
+    position: absolute;
+    top: 5px;
+    left: 5px;
+}
+/*---------------------标准控件-开关(绿色)end---------------------*/
+
+/*---------------------信息提示框 start---------------------*/
+/** html代码
+    <div class="tip">
+        XXXX
+	</div>
+**/
+div.tip{
+    display: none;
+    padding: 13px 10px;
+    font-size: 12px;
+    color: #333;
+    background-color: #fff;
+    border: 1px solid #89aefa;
+    border-radius: 2px;
+    box-shadow: 2px 2px 5px #dedede;
+    -webkit-box-shadow: 2px 2px 5px #dedede;
+    -moz-box-shadow: 2px 2px 5px #dedede;
+    -o-box-shadow: 2px 2px 5px #dedede;
+}
+/*---------------------信息提示框 end---------------------*/
+
+
+/*---------------------提示浮层 start---------------------*/
+.com-supernatant-box{
+    max-width:360px;
+    opacity:.6;
+    border-radius:5px;
+}
+.com-supernatant-box div{
+    position:fixed;
+    top:59%;
+    left:50%;
+    width:100%;
+    transform:translate(-50%,-50%);
+    color: #333;
+}
+.com-supernatant-box .success{
+    background: #f00000;
+}
+.com-supernatant-box .defeat{
+    background: #5078cb;
+}
+/*-------------------------提示浮层 end--------------------*/
+
+/*------下拉选框的使用样式方法------------------------------*/
+/*
+<div class='com-select-option'>
+    <input id="classesType" ng-blur="onBlur()"  ng-click="changeShowLogistics()" type="text" class="form-control" ng-model="message.classes"  placeholder="请选择消息类型" readonly="true" >
+    <ul id="ulContent" ng-if="matchData && showContent" class="dropdown-menu">
+     <li ng-click="showText(classes)" ng-repeat="classes in resultList" ng-class="{'active': $index==selectIndex}" ng-bind="classes" ng-bind="message.classes"></li>
+    </ul>
+ </div>
+*/
+/*-------------------------下拉选框 start-------------- --*/
+.com-select-option {
+    position: relative;
+}
+.com-select-option>input {
+    vertical-align: middle;
+    width: 190px;
+    margin-top: -2px;
+    background-color: white !important;
+    height: 30px;
+    background: url(static/img/index/xiala.png) no-repeat 167px 11px;
+    cursor: pointer;
+}
+.com-select-option .dropdown-menu{
+    top: 90%;
+    left: unset;
+    line-height: 30px;
+    max-height: 300px;
+    overflow-y: auto;
+    width: 190px;
+    display: block;
+    overflow-x: hidden;
+    border-radius: 2px;
+}
+.com-select-option .dropdown-menu li{
+    font-size: 14px;
+    cursor: pointer;
+    padding-left:10px;
+    height: 30px;
+}
+.com-select-option .dropdown-menu li:hover, .dropdown-menu li.active{
+    color: #fff;
+    background: #5078cb;
+}
+/*-------------------------下拉选框 end--------------------*/
+/*-------------------------分页 start--------------------*/
+/*主要分页table(使用tableParams即可)*/
+
+/*主要分页非table代码示例*/
+/*
+<div class="ng-cloak ng-table-pager com-sup-pager">
+    <ul class="pagination ng-table-pagination">
+        <li ng-class="{'disabled': !page.active && !page.current, 'active': page.current}" ng-repeat="page in pages" ng-switch="page.type">
+            <a ng-switch-when="prev" ng-click="setPage(page.type, -1)" href="">&laquo;</a>
+            <a ng-switch-when="first" ng-click="setPage(page.type, page.number)" href=""><span ng-bind="page.number"></span></a>
+            <a ng-switch-when="page" ng-click="setPage(page.type, page.number)" href=""><span ng-bind="page.number"></span></a>
+            <a ng-switch-when="more" ng-click="setPage(page.type, -1)" href="">&#8230;</a>
+            <a ng-switch-when="last" ng-click="setPage(page.type, page.number)" href=""><span ng-bind="page.number"></span></a>
+            <a ng-switch-when="next" ng-click="setPage(page.type, -1)" href="">&raquo;</a>
+        </li>
+    </ul>
+    <div class="page-go-block">
+        <input class="page-number" type="text" ng-model="param.currentPage" ng-keydown="listenEnter()"/>
+        <a class="page-a" ng-click="setPage('page', param.currentPage)">GO</a>
+    </div>
+</div>
+*/
+.com-sup-pager .pagination{
+    margin-bottom: 0;
+}
+.com-sup-pager .pagination.ng-table-pagination > li > a > span {
+    height: 17px;
+    line-height: 17px;
+}
+.com-sup-pager .pagination>.active>a, .pagination>.active>a:focus, .pagination>.active>a:hover, .pagination>.active>span, .pagination>.active>span:focus, .pagination>.active>span:hover{
+    z-index: 2;
+    color: #fff;
+    cursor: default;
+    background-color: #5078cb;
+    border-color: #5078cb;
+}
+.com-sup-pager .pagination.ng-table-pagination > li > a{
+    font-size: 12px;
+}
+.com-sup-pager.ng-table-pager  input.page-number {
+    vertical-align: inherit;
+    display: inline-block;
+    width: 40px;
+    height: 31px;
+    padding: 6px 6px;
+    font-size: 14px;
+    line-height: 1.42857143;
+    color: #9B9792;
+    text-align: center;
+    background-color: #F6F5F4;
+    background-image: none;
+    border: 1px solid #ccc;
+    border-top-left-radius: 4px;
+    border-bottom-left-radius: 4px;
+    box-shadow: inset 0 1px 1px rgba(0,0,0,.075);
+    transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;
+}
+.com-sup-pager.ng-table-pager{
+    margin-right: 0 !important;
+    background: #fff;
+}
+.com-sup-pager.ng-table-pager a.page-a {
+    color: #fff;
+    cursor: pointer;
+    background-color: #5078cb;
+    border-color: #5078cb;
+    padding: 7px 6px;
+    font-size: 14px;
+    border-top-right-radius: 4px;
+    border-bottom-right-radius: 4px;
+    text-decoration: none;
+    height: 31px;
+}
+
+.com-sup-pager.ng-table-pager div.page-go-block {
+    float: right;
+    margin-left: 20px;
+    font-size: 0px;
+    height: 31px;
+    line-height: 31px;
+}
+
+/*次要分页代码示例*/
+/*
+ <div class="ng-cloak ng-table-pager com-sub-pager text-center">
+        <ul class="pagination ng-table-pagination">
+            <li ng-class="{'disabled': !page.active && !page.current, 'active': params.page == page.number}" ng-repeat="page in pages" ng-switch="page.type">
+                <a ng-switch-when="prev" ng-click="setPage(page.type, -1)">&laquo;</a>
+                <a ng-switch-when="first" ng-click="setPage(page.type, page.number)"><span ng-bind="page.number"></span></a>
+                <a ng-switch-when="page" ng-click="setPage(page.type, page.number)"><span ng-bind="page.number"></span></a>
+                <a ng-switch-when="more" ng-click="setPage(page.type, -1)">&#8230;</a>
+                <a ng-switch-when="last" ng-click="setPage(page.type, page.number)"><span ng-bind="page.number"></span></a>
+                <a ng-switch-when="next" ng-click="setPage(page.type, -1)">&raquo;</a>
+            </li>
+        </ul>
+        <div class="page-go-block" ng-if="rolesData.length>6">
+            <input class="page-number" type="text" ng-model="params.currentPage" ng-keydown="listenEnter()"/>
+            <a class="page-a" ng-click="setPage('page', params.currentPage)">GO</a>
+        </div>
+    </div>
+*/
+.com-sub-pager .ng-table-pagination a {
+    border: none;
+    font-size: 12px;
+    cursor: pointer;
+}
+.com-sub-pager .pagination li:first-child a, .pagination li:last-child a{
+    font-size: 20px;
+}
+.com-sub-pager ul.pagination.ng-table-pagination > li > a > span {
+    height: 17px;
+    line-height: 17px;
+    color: #666;
+}
+.com-sub-pager.ng-table-pager {
+    background: #f4f4f4;
+    margin: 0!important;
+    padding-right: 29px;
+}
+.com-sub-pager.ng-table-pager  input.page-number {
+    vertical-align: inherit;
+    display: inline-block;
+    width: 37px;
+    height: 28px;
+    padding: 6px 6px;
+    font-size: 12px;
+    line-height: 1.42857143;
+    color: #9B9792;
+    text-align: center;
+    background-color: #F6F5F4;
+    background-image: none;
+    border: 1px solid #ccc;
+    border-top-left-radius: 4px;
+    border-bottom-left-radius: 4px;
+    box-shadow: inset 0 1px 1px rgba(0,0,0,.075);
+    transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;
+}
+
+.com-sub-pager.ng-table-pager a.page-a {
+    color: #fff;
+    cursor: pointer;
+    padding: 5.55px 6px;
+    font-size: 12px;
+    border-top-right-radius: 4px;
+    border-bottom-right-radius: 4px;
+    text-decoration: none;
+    height: 31px;
+}
+
+.com-sub-pager.ng-table-pager .page-go-block {
+    float: right;
+    font-size: 0px;
+    height: 31px;
+    margin-top: 20px;
+    line-height: 31px;
+}
+.com-sub-pager.ng-table-pager .ng-table-pagination{
+    text-align: center;
+    max-width: 460px;
+    margin: 0;
+}
+.com-sub-pager.ng-table-pager .ng-table-pagination a{
+    height: 29px;
+    line-height: 13px;
+}
+.com-sub-pager .pagination li.active a span{
+    color: white !important;
+}
+.com-sub-pager.ng-table-pager .ng-table-pagination li.active a {
+    background: none!important;
+}
+.com-sub-pager.ng-table-pager .ng-table-pagination li a {
+    background: none!important;
+}
+.com-sub-pager.ng-table-pager .ng-table-pagination li.active a span {
+    color: #5078cb!important;
+}
+/*-------------------------分页 end--------------------*/

+ 555 - 0
src/main/webapp/resources/css/pay.css

@@ -0,0 +1,555 @@
+.down-payment{
+    width: 100%;
+    margin:0 auto;
+    background: #fff;
+    display: inline-block;
+    padding-bottom: 70px;
+}
+.down-payment .content{
+    width: 1000px;
+    margin: 0 auto;
+    border: #89aefa 1px solid;
+    margin-top: 15px;
+    padding-bottom: 30px;
+}
+.payment-title{
+    width: 100%;
+    height: 42px;
+    line-height: 42px;
+    font-size: 14px;
+    background: #f9f9fa;
+    padding-left: 10px;
+}
+.payment-title em{
+    color: #fe3e3c;
+}
+.common-title{
+    width: 100%;
+    height: 40px;
+    line-height: 40px;
+    font-size: 14px;
+    font-weight: bold;
+    padding-left: 10px;
+    margin-top: 20px;
+}
+.common-title.margin-top-none{
+    margin-top: 2px;
+}
+.down-payment .order-list{
+    width: 100%;
+    margin: 0 auto;
+    background: #f5f8fe;
+}
+.down-payment .order-list ul{
+    width: 100%;
+    margin: 0 auto;
+    display: inline-block;
+}
+.down-payment .order-list li{
+    width: 25%;
+    height: 42px;
+    /*background: #f9f9fa;*/
+    line-height: 42px;
+    float: left;
+}
+.down-payment .payment-style ul li.no-count span{
+    margin-left: 28px;
+}
+.down-payment .payment-style ul li.no-count span i{
+    font-size: 16px;
+    color: #5078cb;
+    margin-right: 5px;
+}
+.down-payment .payment-style ul li.no-count span a{
+    color: #5078cb;
+}
+.down-payment .order-list li a{
+    font-size: 14px;
+}
+.down-payment .order-list li a:hover{
+    color: #5078cb;
+}
+.down-payment .order-list li a em{
+    display: inline-block;
+    width: 15px;
+    height: 15px;
+    background: #89aefa;
+    border-radius: 2px;
+    text-align: center;
+    font-size: 12px;
+    color: #fff;
+    line-height: 15px;
+    margin: 0 10px 0 28px;
+    position: relative;
+    top: -1px;
+}
+.check-act input{
+    display: none;
+}
+.check-act label{
+    width: 12px;
+    height: 12px;
+    display: inline-block;
+    background: url(../img/icon/check-rule.png) no-repeat;
+    position: relative;
+    top: 15px;
+    margin-right: 10px;
+    margin-left: 28px;
+}
+.check-act label{
+    background-position: 0 0;
+}
+.check-act input:checked + label{
+    background-position: -15px 0;
+}
+.word-in-10 {
+    max-width: 152px;
+    display: inline-block;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+.down-payment .payment-style{
+    width:100%;
+    margin: 0 auto;
+    background: #f5f8fe;
+}
+.down-payment .payment-style ul{
+    width: 100%;
+    margin: 0 auto;
+    display: inline-block;
+}
+.down-payment .payment-style ul li{
+    width: 100%;
+    float: left;
+    height: 42px;
+    line-height: 42px;
+    font-size: 14px;
+}
+.down-payment .payment-style ul li div{
+    float: left;
+}
+.down-payment .payment-style ul li label{
+    float: left;
+}
+.down-payment .payment-style ul li .tip-content{
+    position: relative;
+}
+.down-payment .payment-style ul li div{
+    margin-right: 30px;
+}
+.down-payment .payment-style ul li .tip-content img{
+    position: relative;
+    top: -2px;
+}
+.down-payment .payment-style ul li .tip-content img:hover + .tip-content-01{
+    display: inline-block;
+}
+.down-payment .payment-style ul li .tip-content .tip-content-01{
+    display: none;
+    position: absolute;
+    left: -82px;
+    top: 40px;
+    width: 233px;
+    height: 80px;
+    border: #89aefa 1px solid;
+    box-shadow: 1px 1px 5px #999;
+    font-size: 12px;
+    color: #666;
+    line-height: 20px;
+    padding-left: 11px;
+    padding-top: 7px;
+    background: #fff;
+    z-index: 500;
+}
+.down-payment .pay-price{
+    width: 100%;
+    margin: 0 auto;
+    display: inline-block;
+    padding-right: 14px;
+}
+.down-payment .pay-price div.row{
+    font-size: 16px;
+    margin: 0;
+    margin-top: 20px;
+}
+.down-payment .pay-price div.row em{
+    font-size: 18px;
+    color: #e41515;
+    font-weight: bold;
+}
+.down-payment .pay-price div.row button{
+    border: none;
+    width: 64px;
+    height: 30px;
+    line-height: 30px;
+    background: #5078cb;
+    text-align: center;
+    color: #fff;
+    float: right;
+    font-size: 14px;
+}
+
+/*立即支付*/
+.payment-style ul.payment-80{
+   max-height: 80px;
+}
+.payment-style ul.payment-80 li{
+    height: 35px;
+    line-height: 35px;
+}
+.payment-style ul.payment-80 .check-act label{
+    top: 12px;
+}
+.payment-detail{
+    width: 100%;
+    margin: 0 auto;
+    background: #f5f8fe;
+}
+.payment-detail ul{
+    width: 100%;
+    margin: 0 auto;
+    padding: 18px 0 18px 28px;
+    display: inline-block;
+}
+.payment-detail ul li{
+    width: 100%;
+    float: left;
+    font-size: 14px;
+    margin-bottom: 16px;
+}
+.payment-detail ul li:last-child{
+    margin-bottom: 0;
+}
+.payment-detail ul li span:nth-child(2){
+    margin: 0 50px 0 25px;
+}
+.payment-detail ul li em img{
+    position: relative;
+    top: -3px;
+}
+.change-count{
+    width: 70px;
+    height: 22px;
+    border: none;
+    line-height: 22px;
+    border-radius: 2px;
+    color: #fff;
+    background: #ff8522;
+}
+.common-title.margin-top-8{
+    margin-top: 8px;
+}
+.payment-upload{
+    width: 100%;
+    margin: 0 auto;
+    background: #f5f8fe;
+    margin-top: -2px;
+}
+.payment-upload ul{
+    width: 100%;
+    margin: 0 auto;
+    display: inline-block;
+    padding-left: 28px;
+    padding-top: 15px;
+}
+.payment-upload ul li{
+    width: 114px;
+    float: left;
+    margin-left: 40px;
+}
+.payment-upload ul li:first-child{
+    margin-left: 0;
+}
+.payment-upload ul li .upload{
+    width: 114px;
+    height: 114px;
+    background: #fff;
+    position: relative;
+    overflow: hidden;
+}
+.payment-upload ul li .upload .img{
+    width: 100%;
+    height: 100%;
+    text-align: center;
+}
+.payment-upload ul li .upload .img img{
+    width: 114px;
+    height: 114px;
+}
+.payment-upload ul li .price{
+    width: 114px;
+    height: 26px;
+    margin: 0 auto;
+    margin-top: 26px;
+}
+.payment-upload ul li .price em{
+    width: 21px;
+    height: 26px;
+    display: inline-block;
+    text-align: center;
+    line-height: 26px;
+    color: #fff;
+    background: #5078cb;
+    float: left;
+    border-bottom-left-radius: 2px;
+    border-top-left-radius: 2px;
+}
+.payment-upload ul li .price input{
+    width: 93px;
+    height: 26px;
+    padding: 0;
+    line-height: 26px;
+    float: right;
+    border-radius: 0;
+    text-align: center;
+    font-size: 12px;
+}
+.img-specifications{
+    width: 100%;
+    padding: 14px 28px;
+    color: #999;
+    font-size: 12px;
+}
+.down-payment .pay-price div.stage{
+    margin-top: 0;
+}
+.down-payment .pay-price div.stage .content{
+    width: 250px;
+    float: right;
+    border: none;
+    margin-top: 0;
+    padding-bottom: 0;
+}
+.down-payment .pay-price div.stage p{
+    height: 30px;
+    font-size: 14px;
+    line-height: 30px;
+    background: #f5f8fe;
+}
+.down-payment .pay-price div.stage p em{
+    font-size: 14px;
+    color: #333;
+}
+.down-payment .pay-price div.stage p.total{
+    background: #fff;
+    font-size: 16px;
+    margin-top: 5px;
+}
+.down-payment .pay-price div.stage p.total em{
+    font-size: 18px;
+}
+.down-payment .pay-price div.stage p span{
+    width: 60px;
+    text-align: right;
+    display: inline-block;
+    margin-left: 55px;
+}
+.red{
+    color: #e41515 !important;
+}
+.bule{
+    color: #5078cb !important;
+}
+
+.deal-btn{
+    width: 100%;
+    margin: 0 auto;
+    text-align: center;
+    margin-top: 18px;
+}
+.deal-btn a{
+    width: 70px;
+    height: 30px;
+    display: inline-block;
+    text-align: center;
+    line-height: 30px;
+    font-size: 14px;
+}
+.deal-btn a.off{
+    background: #cdcccc;
+    color: #fff;
+    margin-right: 8px;
+}
+.deal-btn a.ok{
+    background: #5078cb;
+    color: #fff;
+}
+.deal-btn a:hover{
+    background: #337ab7;
+    color: #fff;
+}
+.down-payment .pay-price div.row .deal-btn{
+    margin-top: 12px;
+}
+.down-payment .pay-price div.row .deal-btn a{
+    float: right;
+}
+.down-payment .pay-price div.row .deal-btn a.off{
+    margin-right: 10px;
+}
+.down-payment .hover-show{
+    position: absolute;
+    width: 100%;
+    height: 100%;
+    left: 0;
+    top: 100%;
+    background: rgba(0,0,0,.35);
+}
+.payment-upload ul li .upload:hover .hover-show{
+    top: 0;
+}
+.down-payment .hover-show a{
+    display: inline-block;
+    width: 100%;
+    height: 100%;
+    font-size: 14px;
+    color: #fff;
+    text-align: center;
+    line-height: 114px;
+}
+.down-payment .hover-show a i{
+    margin-right: 5px;
+}
+.down-payment .hover-show span.delete{
+    position: absolute;
+    z-index: 100;
+    display: inline-block;
+    width: 30px;
+    height: 30px;
+    right: 0;
+    top: 0;
+    color: #fff;
+    font-size: 14px;
+    line-height: 30px;
+    text-align: center;
+}
+.down-payment .hover-show span.delete i{
+    font-size: 18px;
+}
+/*修改扫描单*/
+.payment-upload-list{
+    width: 100%;
+    margin: 0 auto;
+    background: #ecf2fd;
+    display: inline-block;
+    padding: 15px 0 0 10px;
+}
+.payment-upload-list .item{
+    width: 140px;
+    float: left;
+    margin: 0 7px;
+}
+.payment-upload-list .item .img-list{
+    width: 100%;
+    height: 114px;
+    margin: 0 auto;
+}
+.payment-upload-list .item .img-list div{
+    float: left;
+}
+.payment-upload-list .item .img-list .img{
+    width: 114px;
+    height: 114px;
+    border: solid 1px rgb(212, 212, 212);
+    position: relative;
+    overflow: hidden;
+    background: #fff;
+}
+.payment-upload-list .item .img-list .number{
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 47px;
+    height: 47px;
+    display: inline-block;
+    background: url("../img/icon/nummber-bg.png") no-repeat center;
+    z-index: 20;
+}
+.payment-upload-list .item .img-list .number em{
+    line-height: 30px;
+    font-size: 12px;
+    color: #fff;
+    transform: rotate(-45deg);
+    display: inline-block;
+    position: relative;
+    left: -3px;
+}
+.payment-upload-list .item .img-list div.prev,.payment-upload-list .item .img-list div.next{
+    width: 10px;
+    height: 16px;
+    font-size: 28px;
+    position: relative;
+    top: 40px;
+    color: #c9c9c7;
+}
+.payment-upload-list .item .img-list div.prev:hover,.payment-upload-list .item .img-list div.next:hover{
+    color: #5078cb;
+}
+.payment-upload-list .item .img-list div.prev{
+    margin-right: 3px;
+}
+.payment-upload-list .item .img-list div.next{
+    margin-left: 3px;
+}
+.payment-upload-list .item .img-list .list,.payment-upload-list .item .img-list .list img{
+    width: 114px;
+    height: 114px;
+    margin: 0 auto;
+    position: relative;
+}
+.payment-upload-list .item .img-list .list span{
+    width: 114px;
+    height: 114px;
+    display: inline-block;
+}
+.payment-upload-list .item .img-list .list:hover .hover-show{
+    top: 0;
+}
+.payment-upload-list .item .price-input{
+    width: 114px;
+    height: 26px;
+    line-height: 26px;
+    margin-left: 13px;
+}
+.payment-upload-list .item .price-input input{
+    height: 26px;
+    text-align: center;
+    font-size: 14px;
+    color: #5078cb;
+    border: #5078cb 1px solid;
+    background: #fff;
+    border-radius: 0;
+    cursor: default;
+}
+.payment-upload-list .item .time{
+    width:100%;
+    font-size: 12px; color: #999999;
+    text-align: left;
+    margin: 16px 0 15px 13px;
+}
+.payment-upload-list .item .small-img{
+    width: 114px;
+    height: 15px;
+    margin: 4px 0 8px 13px;
+}
+.payment-upload-list .item  .small-img span{
+    width: 15px;
+    height: 15px;
+    display: inline-block;
+    overflow: hidden;
+    border: #e0dddd 1px solid;
+    background: #e0dddd;
+    float: left;
+    margin-left: 4.5px;
+}
+.payment-upload-list .item  .small-img span:first-child{
+    margin-left: 0;
+}
+.payment-upload-list .item .small-img span.active,.payment-upload-list .item .small-img span:hover{
+    border: #5078cb 1px solid;
+}
+.payment-upload-list .item .small-img span img{
+    width: 15px;
+    height: 15px;
+}

BIN
src/main/webapp/resources/img/icon/close.png


BIN
src/main/webapp/resources/img/icon/icon-no.png


BIN
src/main/webapp/resources/img/icon/icon-xiala.png


BIN
src/main/webapp/resources/img/icon/icon-yes.png


BIN
src/main/webapp/resources/img/icon/img.png


BIN
src/main/webapp/resources/img/icon/nummber-bg.png


BIN
src/main/webapp/resources/img/icon/pay-ok-icon.png


BIN
src/main/webapp/resources/img/icon/payment-add.png


BIN
src/main/webapp/resources/img/icon/payment-upload.png


BIN
src/main/webapp/resources/img/user/images/404.png


+ 3 - 1
src/main/webapp/resources/js/admin/controllers/checkMoney/SettlementCtrl.js

@@ -39,7 +39,9 @@ define(['app/app'], function(app) {
 					delete $scope.logoUrl;
 					delete $scope.imageUrl;
 					delete $scope.b2cAccount.filterAccount;
-					delete $scope.venderAccount.filterAccount;
+					if ($scope.venderAccount.filterAccount){
+						delete $scope.venderAccount.filterAccount;
+					}
 					$scope.batchCheckStatus = false;
 					$scope.oneCheckStatus = true;
 				}

+ 19 - 10
src/main/webapp/resources/js/common/query/bankInfo.js

@@ -4,10 +4,8 @@ define(['ngResource'], function(ngResource) {
 			getBuyPersonalBank : {
 				url : 'trade/bankInfo/buy/personal',
 				method : 'GET',
-				isArray : true,
 				params : {type : 'buyer'}
 			},
-			
 			getBuyEnterpriseBank : {
 				url : 'trade/bankInfo/buy/enterprise',
 				method : 'GET',
@@ -17,11 +15,9 @@ define(['ngResource'], function(ngResource) {
 					status : 104
 				}
 			},
-			
 			getSaleEeterpriseBank : {
 				url : 'trade/bankInfo/sale/enterprise',
 				method: 'GET',
-				isArray : true,
 				params : {type : 'sup'}
 			},
 			getSaleEeterpriseBankAudit : {
@@ -33,6 +29,15 @@ define(['ngResource'], function(ngResource) {
 					status : 104
 				}
 			},
+			getSaleEeterprise : {
+				url : 'trade/bankInfo/sale/enterprise/:enuu',
+				method: 'GET',
+				isArray : true,
+				params : {
+					type : 'sup',
+					status : 104
+				}
+			},
 			getPageStatusBankInfo : {
 				url : 'trade/bankInfo/page/bankinfo',
 				method : 'GET'
@@ -57,7 +62,10 @@ define(['ngResource'], function(ngResource) {
 					status : 104
 				}
 			},
-			
+			getCountByNumber : {
+				url : 'trade/bankInfo/number/count',
+				method: 'GET'
+			},
 			deleteBank : {
 				url : 'trade/bankInfo/delete/:id',
 				method : 'DELETE'
@@ -88,11 +96,12 @@ define(['ngResource'], function(ngResource) {
 				params : {type : 'buyer'}
 			},
 
-			saveBuyEnterpriseBank : {
-				url : 'trade/bankInfo/save/enterprise',
-				method : 'POST',
-				params : {type : 'buyer'}
-			},
+			// saveBuyEnterpriseBank : {
+			// 	url : 'trade/bankInfo/save/enterprise',
+			// 	method : 'POST',
+			// 	params : {type : 'buyer'}
+			// },
+
 			//保存商城的企业账户
 			saveAdminEnteAccount: {
 				url : 'trade/bankInfo/b2c/enterprise/save',

+ 4 - 1
src/main/webapp/resources/js/common/query/bankTransfer.js

@@ -47,7 +47,10 @@ define(['ngResource'], function(ngResource) {
 			},
 			getVendorBankTransferByMall : {
 				url : 'trade/transfer/vendor/bankTransfer/page',
-				method : 'GET'
+				method : 'GET',
+				params : {
+					type : 'sup'
+				}
 			}
 		});
 	}]);

+ 27 - 0
src/main/webapp/resources/js/common/query/installments.js

@@ -0,0 +1,27 @@
+define([ 'ngResource' ], function() {
+    angular.module('installmentServices', [ 'ngResource' ]).factory('Installment', ['$resource', 'BaseService', function($resource, BaseService) {
+        var rootPath = BaseService.getRootPath();
+        return $resource('/trade/installments', {}, {
+            // 新增分期信息
+            addInstallment: {
+                url: rootPath + '/trade/installments',
+                method: 'POST'
+            },
+            // 更新分期信息
+            updateInstallment: {
+                url: rootPath + '/trade/installments',
+                method: 'PUT'
+            },
+            // 删除分期信息
+            deleteInstallment: {
+                url: rootPath + '/trade/installments/:purchaseId',
+                method: 'DELETE'
+            },
+            // 验证是否能启用分期信息
+            validationCount: {
+                url: rootPath + '/trade/installments/:purchaseId/validate',
+                method: 'GET'
+            }
+        });
+    }])
+});

+ 13 - 2
src/main/webapp/resources/js/common/query/order.js

@@ -300,7 +300,8 @@ define([ 'ngResource' ], function() {
                 method : 'PUT'
             }
         });
-    }]).factory('OrderSimpleInfo', ['$resource', function($resource) {
+    }]).factory('OrderSimpleInfo', ['$resource','BaseService', function($resource, BaseService) {
+        var rootPath = BaseService.getRootPath();
         //获取order的分页数据
         return $resource('trade/order/simpleinfo', {}, {
             //获得所有简单数据
@@ -367,8 +368,18 @@ define([ 'ngResource' ], function() {
                 method : 'PUT'
             },
             getBuyPayRecord : {
-                url : 'trade/order/payRecord',
+                url : 'trade/order/buyer/payRecord',
                 method : 'GET'
+            },
+            // 买家同意取消订单申请
+            userAuditCancelOrder : {
+                url : rootPath + '/trade/order/simpleinfo/ones/:orderid/release/audit',
+                method : 'PUT'
+            },
+            // 买家不同意取消订单申请
+            userUnauditCancelOrder : {
+                url : rootPath + '/trade/order/simpleinfo/ones/:orderid/release/unaudit',
+                method : 'PUT'
             }
         });
     }]);

+ 10 - 0
src/main/webapp/resources/js/common/query/purchase.js

@@ -227,6 +227,16 @@ define([ 'ngResource' ], function() {
 			getPurchaseByOrder : {
 				url : 'trade/purchase/orderid/:orderid',
 				method : 'GET'
+			},
+			// 确认收款
+			confirmPaymentInstallment : {
+				url : rootPath +'/trade/purchase/:id/ensurePaid',
+				method : 'PUT'
+			},
+			// 取消订单
+			sellerCancelOrder : {
+				url : rootPath +'/trade/purchase/simpleinfo/ones/:purchaseId/release',
+				method : 'PUT'
 			}
 		});
 	}]);

+ 1 - 1
src/main/webapp/resources/js/prod/controllers/KindAdviceCtrl.js

@@ -2,7 +2,7 @@ define([ 'app/app' ], function(app) {
 	'use strict';
 	app.register.controller('KindAdviceCtrl', ['$scope', 'KindAdvice', 'toaster', function($scope, KindAdvice, toaster) {
 		$scope.advice = {};
-		
+		document.title =  '类目建议-优软商城';
 		$scope.submit = function() {
 			if($scope.advice.schema && $scope.advice.schema.length >= 15) {
 			} else {

+ 6 - 0
src/main/webapp/resources/js/usercenter/app.js

@@ -407,6 +407,12 @@ define([ 'angularAMD', 'ui.router', 'ui-bootstrap', 'ngLocal', 'ngTable', 'commo
 			templateUrl : 'static/view/usercenter/forstore/show_rate.html',
 			controller : 'showRateCtrl',
 			controllerUrl : 'app/controllers/forstore/show_rate_ctrl'
+		})).state('downPayment', angularAMD.route({
+			// 线下付款
+			url : '/downPayment/:orderid',
+			templateUrl : 'static/view/usercenter/forstore/buyer_down_payment.html',
+			controller : 'downPaymentCtrl',
+			controllerUrl : 'app/controllers/forstore/buyer_down_payment_ctrl'
 		}));
 	}]);
 

+ 1 - 1
src/main/webapp/resources/js/usercenter/controllers/ComponentStoreCtrl.js

@@ -2,7 +2,7 @@ define(['app/app'], function(app) {
 	'use strict';
 	app.register.controller('ComponentStoreCtrl', ['$rootScope', '$scope', 'ngTableParams', 'toaster', 'collectionService', 'BaseService', 'SessionService', function($rootScope, $scope, ngTableParams, toaster, collectionService, BaseService, SessionService) {
 		BaseService.scrollBackToTop();
-		
+		document.title = '产品收藏-优软商城';
 		$scope.pageInfo = {};
 		$scope.pageInfo.page = 1;	// 默认初始页码为1
 		$scope.pageInfo.count = 25; // 每页数量为25

+ 1 - 1
src/main/webapp/resources/js/usercenter/controllers/forstore/browsing_history.js

@@ -2,7 +2,7 @@ define(['app/app'], function(app) {
     'use strict';
     app.register.controller('browsingHistoryCtrl', ['$scope', '$rootScope', 'toaster', 'GoodsBrowsingHistory', 'Goods', '$filter', function($scope, $rootScope, toaster, GoodsBrowsingHistory, Goods, $filter){
         $rootScope.active = 'store_focus_ctrl';
-
+        document.title = '浏览历史-优软商城';
         $scope.param = {};
         $scope.param.page = 1;
         $scope.param.count = 25;

+ 192 - 192
src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_cart_ctrl.js

@@ -5,7 +5,7 @@ define(["app/app", 'jquery-summernote'], function(app) {
 	"use strict";
 	app.register.controller("buyerCartCtrl", ["$scope", "$rootScope", 'toaster', '$modal', 'ngTableParams', 'BaseService', 'Cart', '$filter' , 'ComponentActive', '$location', 'Order', '$state', 'SessionService', 'EncryptionService', 'Recommendation', 'NumberService', 'Goods', 'collectionService', 'AuthenticationService', '$window', '$timeout', function($scope, $rootScope, toaster, $modal, ngTableParams, BaseService, Cart, $filter ,ComponentActive, $location, Order, $state, SessionService, EncryptionService, Recommendation, NumberService, Goods, collectionService, AuthenticationService, $window, $timeout) {
 		$rootScope.active = "buyer_cart";
-
+		document.title = '购物车-优软商城';
 		/* TODO
 		 * 需要把批次的库存带出来,并给颜色,提示用户删除或修改那一条记录
 		 * */
@@ -43,47 +43,47 @@ define(["app/app", 'jquery-summernote'], function(app) {
 		$scope.isChooseAll = false;
 
 		$scope.loadData = function (){
-				Cart.getPageInfo($scope.pageInfo, function(data) {
-					$scope.isDataLoading = false;
-					$scope.total = data.totalElements;
-					$scope.pageNum = data.totalPages;
+			Cart.getPageInfo($scope.pageInfo, function(data) {
+				$scope.isDataLoading = false;
+				$scope.total = data.totalElements;
+				$scope.pageNum = data.totalPages;
 
-					angular.forEach(data.content, function (cart) {
-						cart.buyCurrency = cart.currencyName.indexOf("RMB") > -1 ? "RMB" : "USD";
-						cart.isSelect = false;
-						//计算分段和统计一下价格
-						$scope.getPrice(cart);
-
-						//便于后期循环
-						$scope.carts.push(cart);
-						$scope.disabledAddAndSub(cart);
-						$scope.countByPage += 1;
-						var isContain = false;
-						for (var i = 0; i < $scope.cartMap.length; i++) {
-							if(angular.equals($scope.cartMap[i].name, cart.storeName)) {
-								$scope.cartMap[i].arr.push(cart);
-								isContain = true;
-							}
-						}
-						if(!isContain) {
-							var obj = {};
-							obj.name = cart.storeName;
-							obj.arr = [];
-							obj.arr.push(cart);
-							$scope.cartMap.push(obj);
+				angular.forEach(data.content, function (cart) {
+					cart.buyCurrency = cart.currencyName.indexOf("RMB") > -1 ? "RMB" : "USD";
+					cart.isSelect = false;
+					//计算分段和统计一下价格
+					$scope.getPrice(cart);
+
+					//便于后期循环
+					$scope.carts.push(cart);
+					$scope.disabledAddAndSub(cart);
+					$scope.countByPage += 1;
+					var isContain = false;
+					for (var i = 0; i < $scope.cartMap.length; i++) {
+						if(angular.equals($scope.cartMap[i].name, cart.storeName)) {
+							$scope.cartMap[i].arr.push(cart);
+							isContain = true;
 						}
-					});
-					$scope.cartIsEmpty = !$scope.carts.length ? true : false;
-					//设置全选的复选框
-					$scope.isChooseAll = $scope.isAllSelect($scope.carts);
+					}
+					if(!isContain) {
+						var obj = {};
+						obj.name = cart.storeName;
+						obj.arr = [];
+						obj.arr.push(cart);
+						$scope.cartMap.push(obj);
+					}
+				});
+				$scope.cartIsEmpty = !$scope.carts.length ? true : false;
+				//设置全选的复选框
+				$scope.isChooseAll = $scope.isAllSelect($scope.carts);
 
-					//设置店铺复选框的状态
-					angular.forEach($scope.cartMap, function (store) {
-						$scope.selectedStore[store.name] = $scope.isAllSelect(store.arr);
-					});
-				},function() {
-					toaster.pop('error', "提示", "获取购物车信息失败,请刷新页面");
+				//设置店铺复选框的状态
+				angular.forEach($scope.cartMap, function (store) {
+					$scope.selectedStore[store.name] = $scope.isAllSelect(store.arr);
 				});
+			},function() {
+				toaster.pop('error', "提示", "获取购物车信息失败,请刷新页面");
+			});
 		};
 
 		$scope.loadData();
@@ -120,7 +120,7 @@ define(["app/app", 'jquery-summernote'], function(app) {
 			//计算总价格
 			$scope.calculateAmount($scope.selectedStoreCarts);
 		};
-		
+
 		// 减少按钮,每次减minPackQty
 		$scope.reduce = function(cart){
 			if(cart.status == 1) {
@@ -139,7 +139,7 @@ define(["app/app", 'jquery-summernote'], function(app) {
 			//计算总价格
 			$scope.calculateAmount($scope.selectedStoreCarts);
 		};
-				
+
 		//根据搜索词过滤购物车信息,对类目、品牌、器件筛选
 		$scope.cartFilterCurrency = function(cartGroup) {
 			var result = false;
@@ -167,8 +167,8 @@ define(["app/app", 'jquery-summernote'], function(app) {
 
 		$scope.closeTable = function() {
 			console.log('0kds');
-        };
-        // //监听点击的位置,隐藏价格梯度的信息
+		};
+		// //监听点击的位置,隐藏价格梯度的信息
 		// document.onclick = function(event) {
 		// 	$scope.$apply(function () {
 		// 		angular.forEach($scope.carts, function (cart) {
@@ -181,9 +181,9 @@ define(["app/app", 'jquery-summernote'], function(app) {
 
 		//查看价格分段。
 		$scope.togglePrice = function (cart) {
-            cart.display = cart.display == 'block' ? 'none' : 'block';
-        };
-        // 统计已勾选批次
+			cart.display = cart.display == 'block' ? 'none' : 'block';
+		};
+		// 统计已勾选批次
 		var creatSelectArr = function(){
 			var arr = [];
 			angular.forEach($scope.carts, function(cart) {
@@ -328,8 +328,8 @@ define(["app/app", 'jquery-summernote'], function(app) {
 						return ;
 					}
 				}
-                $scope.totalMoneyInfo.countBT++;
-                $scope.selectedStoreCarts.push(cart);
+				$scope.totalMoneyInfo.countBT++;
+				$scope.selectedStoreCarts.push(cart);
 			}else {//取消勾选
 				$scope.totalMoneyInfo.countBT--;
 				$scope.selectedStoreCarts = $scope.selectedStoreCarts.filter(function(item) {
@@ -373,36 +373,36 @@ define(["app/app", 'jquery-summernote'], function(app) {
 			}
 		};
 
-        // 清空失效产品
-        $scope.deleteInvalid = function(){
+		// 清空失效产品
+		$scope.deleteInvalid = function(){
 			var arr = [];
-            angular.forEach($scope.carts, function(cart){
-                if(cart.status == 1){
-                    arr.push(cart.id);
-                }
-            });
-            if(arr.length <= 0) {
-                toaster.pop('warning', '提示', '购物车内目前没有失效的产品');
-                return ;
-            }
-            var ids = angular.toJson(arr);
-            $modal.open({
-                templateUrl : 'static/view/common/modal/invalid_delete_modal.html',
-                controller : 'cartDeleteCtrl',
-                size : 'md',
-                resolve : {
-                    description : function () {
-                        return '是否删除购物车内的无效商品';
-                    },
-                    ids : function () {
-                        return ids;
-                    }
-                }
-            }).result.then(function () {
+			angular.forEach($scope.carts, function(cart){
+				if(cart.status == 1){
+					arr.push(cart.id);
+				}
+			});
+			if(arr.length <= 0) {
+				toaster.pop('warning', '提示', '购物车内目前没有失效的产品');
+				return ;
+			}
+			var ids = angular.toJson(arr);
+			$modal.open({
+				templateUrl : 'static/view/common/modal/invalid_delete_modal.html',
+				controller : 'cartDeleteCtrl',
+				size : 'md',
+				resolve : {
+					description : function () {
+						return '是否删除购物车内的无效商品';
+					},
+					ids : function () {
+						return ids;
+					}
+				}
+			}).result.then(function () {
 				afterDeleteRefreshInfo(arr);
 			}, function () {
-            });
-        };
+			});
+		};
 
 		var afterDeleteRefreshInfo = function (arr) {
 			if(arr.length < 1) {
@@ -446,22 +446,22 @@ define(["app/app", 'jquery-summernote'], function(app) {
 			$scope.calculateAmount($scope.selectedStoreCarts);
 		}
 
-        $scope.deleteById = function(id){
-            var arr = [];
-            if(id != null){
-                arr.push(id);
-            }else {
-                angular.forEach($scope.carts, function(cart){
-                    if(cart.isSelect){
-                        arr.push(cart.id);
-                    }
-                });
-            }
-            if(arr.length <= 0) {
+		$scope.deleteById = function(id){
+			var arr = [];
+			if(id != null){
+				arr.push(id);
+			}else {
+				angular.forEach($scope.carts, function(cart){
+					if(cart.isSelect){
+						arr.push(cart.id);
+					}
+				});
+			}
+			if(arr.length <= 0) {
 				toaster.pop('warning', '提示', '请选择需要删除的商品');
 				return ;
 			}
-            var ids = angular.toJson(arr);
+			var ids = angular.toJson(arr);
 			$modal.open({
 				templateUrl : 'static/view/common/modal/delete_modal.html',
 				controller : 'cartDeleteCtrl',
@@ -470,9 +470,9 @@ define(["app/app", 'jquery-summernote'], function(app) {
 					description : function () {
 						return '是否删除此商品';
 					},
-                    ids : function () {
-                        return ids;
-                    }
+					ids : function () {
+						return ids;
+					}
 				}
 			}).result.then(function () {
 				afterDeleteRefreshInfo(arr);
@@ -499,8 +499,8 @@ define(["app/app", 'jquery-summernote'], function(app) {
 				});
 				return !contain;
 			});
-        };
-        //判断是空对象
+		};
+		//判断是空对象
 		$scope.isNullObject = function(obj) {
 			var isObject = true;
 			for(var k in obj) {
@@ -538,8 +538,8 @@ define(["app/app", 'jquery-summernote'], function(app) {
 					cart.contactSeller = false;
 				};
 			});
-        };
-        /**
+		};
+		/**
 		 * 监听点击的位置,隐藏相应的状态框
 		 * @param event
 		 */
@@ -576,8 +576,8 @@ define(["app/app", 'jquery-summernote'], function(app) {
 					if(!isThisTag) {
 						$scope.carts[i].contactSeller = false;
 					}
-                }
-            });
+				}
+			});
 		};
 
 
@@ -599,23 +599,23 @@ define(["app/app", 'jquery-summernote'], function(app) {
 		$scope.setAllCartCheck = function(checked) {
 			$scope.selectedStoreCarts = [];
 			angular.forEach($scope.cartMap, function(store) {
-					if(store.arr && store.arr.length > 0) {
-						var storeChecked = false;
-						angular.forEach(store.arr, function (cart) {
-							if(cart.status != 1 && checked) {//购物车的信息是否有效【是否下架】
-								cart.isSelect = checked;
-								storeChecked = true;
-								$scope.selectedStoreCarts.push(cart);
-							}else {
-								cart.isSelect = false;
-							}
-						});
-						if(storeChecked) {
-							$scope.selectedStore[store.name] = checked;//店铺的复选框也需要同步
+				if(store.arr && store.arr.length > 0) {
+					var storeChecked = false;
+					angular.forEach(store.arr, function (cart) {
+						if(cart.status != 1 && checked) {//购物车的信息是否有效【是否下架】
+							cart.isSelect = checked;
+							storeChecked = true;
+							$scope.selectedStoreCarts.push(cart);
 						}else {
-							$scope.selectedStore[store.name] = false;//如果没有执行过storeChecked = true,则该店铺代表所有的都没有勾选
+							cart.isSelect = false;
 						}
+					});
+					if(storeChecked) {
+						$scope.selectedStore[store.name] = checked;//店铺的复选框也需要同步
+					}else {
+						$scope.selectedStore[store.name] = false;//如果没有执行过storeChecked = true,则该店铺代表所有的都没有勾选
 					}
+				}
 
 			});
 		};
@@ -634,8 +634,8 @@ define(["app/app", 'jquery-summernote'], function(app) {
 				}
 			}
 			return !isAlldisabled&&isAllChecked;
-        };
-        /**
+		};
+		/**
 		 * 店铺选中状态信息
 		 */
 		$scope.selectedStore = {};
@@ -780,17 +780,17 @@ define(["app/app", 'jquery-summernote'], function(app) {
 			SessionService.set("buyNow",false);
 			var jsonOrderDetails = angular.toJson(result);
 			Order.saveByGroup({}, jsonOrderDetails, function(result){
-                if(result.code == 1) {
+				if(result.code == 1) {
 					if(result.message) {
 						toaster.pop('info', result.message);
 					}
-                    $state.go('order_pay', {orderid :  enIdFilter(result.data.orderid)});
-                }else if(result.code == 7){
-                    toaster.pop('info', '提示', "选中的购物车信息已经失效,将为您刷新界面之后重新操作");
+					$state.go('order_pay', {orderid :  enIdFilter(result.data.orderid)});
+				}else if(result.code == 7){
+					toaster.pop('info', '提示', "选中的购物车信息已经失效,将为您刷新界面之后重新操作");
 					$timeout(function () {
 						window.location.reload();
 					}, 1500);
-                }else {
+				}else {
 					toaster.pop('info', '提示', result.message);
 				}
 			}, function(res){
@@ -838,41 +838,41 @@ define(["app/app", 'jquery-summernote'], function(app) {
 			}
 
 		};
-        // 移入收藏后删除购物车操作
+		// 移入收藏后删除购物车操作
 		$scope.collectDelete = function(id){
-            var arr = [];
-            if(id != null){
-                arr.push(id);
-            }else {
-                angular.forEach($scope.carts, function(cart){
-                    if(cart.isSelect){
-                        arr.push(cart.id);
-                    }
-                });
-            }
-            var ids = angular.toJson(arr);
-            Cart.deleteById({ids : ids}, function(data){
-                $rootScope.countCart = $rootScope.countCart - arr.length;
-
-                //更新选中的购物车信息
-                $scope.selectedStoreCarts = $scope.arrayFilterId($scope.selectedStoreCarts, arr);
-                //更新购物车信息
-                $scope.carts = $scope.arrayFilterId($scope.carts, arr);
-                //判断是否全部删除,如果全部删除,就将全选置为取消状态。
-                if($scope.carts.length == 0) {
-                    $scope.isChooseAll = false;
+			var arr = [];
+			if(id != null){
+				arr.push(id);
+			}else {
+				angular.forEach($scope.carts, function(cart){
+					if(cart.isSelect){
+						arr.push(cart.id);
+					}
+				});
+			}
+			var ids = angular.toJson(arr);
+			Cart.deleteById({ids : ids}, function(data){
+				$rootScope.countCart = $rootScope.countCart - arr.length;
+
+				//更新选中的购物车信息
+				$scope.selectedStoreCarts = $scope.arrayFilterId($scope.selectedStoreCarts, arr);
+				//更新购物车信息
+				$scope.carts = $scope.arrayFilterId($scope.carts, arr);
+				//判断是否全部删除,如果全部删除,就将全选置为取消状态。
+				if($scope.carts.length == 0) {
+					$scope.isChooseAll = false;
 					$scope.cartIsEmpty = true;
-                }
+				}
 
-                //更新map中购物车信息
-                var deleteStoreName = [];
+				//更新map中购物车信息
+				var deleteStoreName = [];
 				angular.forEach($scope.cartMap, function(store) {
-						if(store.arr && store.arr.length > 0) {
-							store.arr = $scope.arrayFilterId(store.arr, arr)
-							if(!store.arr || !store.arr.length || store.arr.length == 0) {
-								deleteStoreName.push(store.name);
-							}
+					if(store.arr && store.arr.length > 0) {
+						store.arr = $scope.arrayFilterId(store.arr, arr)
+						if(!store.arr || !store.arr.length || store.arr.length == 0) {
+							deleteStoreName.push(store.name);
 						}
+					}
 				});
 				//删除$scope.cartMap多余的部分。
 				angular.forEach(deleteStoreName, function(storeName) {
@@ -881,27 +881,27 @@ define(["app/app", 'jquery-summernote'], function(app) {
 					});
 				});
 
-                //计算总金额
-                $scope.calculateAmount($scope.selectedStoreCarts);
+				//计算总金额
+				$scope.calculateAmount($scope.selectedStoreCarts);
 
-            }, function (res) {
-                toaster.pop('error', '系统错误', '购物车信息删除失败' + res.data);
-            });
+			}, function (res) {
+				toaster.pop('error', '系统错误', '购物车信息删除失败' + res.data);
+			});
 
 
 		};
-        // 移入收藏
-        $scope.collect = function(uuid, id) {
+		// 移入收藏
+		$scope.collect = function(uuid, id) {
 			if(uuid){
-                ComponentActive.getSimpleInfoByUuid({uuid: uuid}, { }, function(data){
-                    var obj = {'componentid': data.id, 'kind': 2};
-                    collectionService.saveEntity({ }, obj, function(data) {
-                        $scope.collectDelete(id);
-                        toaster.pop('success', '收藏成功');
-                    }, function(response) {
-                        toaster.pop('error', '收藏失败');
-                    })
-                });
+				ComponentActive.getSimpleInfoByUuid({uuid: uuid}, { }, function(data){
+					var obj = {'componentid': data.id, 'kind': 2};
+					collectionService.saveEntity({ }, obj, function(data) {
+						$scope.collectDelete(id);
+						toaster.pop('success', '收藏成功');
+					}, function(response) {
+						toaster.pop('error', '收藏失败');
+					})
+				});
 			}else{
 				var uuids = [];
 				angular.forEach($scope.cartMap, function(store){
@@ -915,14 +915,14 @@ define(["app/app", 'jquery-summernote'], function(app) {
 					toaster.pop('info', '你还未选择任何产品');
 					return;
 				}
-                collectionService.saveStores({ }, uuids, function(response){
+				collectionService.saveStores({ }, uuids, function(response){
 					if(response.data == "success"){
-                        $scope.collectDelete();
-                        toaster.pop('success', '收藏成功');
+						$scope.collectDelete();
+						toaster.pop('success', '收藏成功');
 					}
 				},function () {
-                    toaster.pop('error', '收藏失败');
-                })
+					toaster.pop('error', '收藏失败');
+				})
 			}
 		}
 
@@ -968,32 +968,32 @@ define(["app/app", 'jquery-summernote'], function(app) {
 		}
 	}]);
 
-    /**
-     * 删除的逻辑
-     */
+	/**
+	 * 删除的逻辑
+	 */
 	app.register.controller('cartDeleteCtrl', ['$scope', 'description', 'Cart', '$modalInstance', 'toaster', 'ids', function ($scope, description, Cart, $modalInstance, toaster,ids) {
 
-        $scope.confirmDelete = function () {
-            Cart.deleteById({ids : ids}, function(data){
-                toaster.pop('success', '成功删除');
-                $modalInstance.close()
-            }, function (res) {
-                toaster.pop('error', '系统错误', '购物车信息删除失败' + res.data);
-            });
-        };
-
-        $scope.confirmDeleteInvalid = function () {
-            Cart.deleteById({ids : ids}, function(data){
-                toaster.pop('success', '成功清除购物车内的无效产品');
-                $modalInstance.close()
-            }, function (res) {
-                toaster.pop('error', '系统错误', '购物车信息删除失败' + res.data);
-            });
-        };
-
-        $scope.cancleDelete = function () {
-            $modalInstance.dismiss();
-        }
+		$scope.confirmDelete = function () {
+			Cart.deleteById({ids : ids}, function(data){
+				toaster.pop('success', '成功删除');
+				$modalInstance.close()
+			}, function (res) {
+				toaster.pop('error', '系统错误', '购物车信息删除失败' + res.data);
+			});
+		};
+
+		$scope.confirmDeleteInvalid = function () {
+			Cart.deleteById({ids : ids}, function(data){
+				toaster.pop('success', '成功清除购物车内的无效产品');
+				$modalInstance.close()
+			}, function (res) {
+				toaster.pop('error', '系统错误', '购物车信息删除失败' + res.data);
+			});
+		};
+
+		$scope.cancleDelete = function () {
+			$modalInstance.dismiss();
+		}
 
 	}]);
 

+ 144 - 0
src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_down_payment_ctrl.js

@@ -0,0 +1,144 @@
+define([ 'app/app' ], function(app) {
+
+    app.register.controller('downPaymentCtrl', ['$scope', '$rootScope', '$anchorScroll', '$location','SessionService', 'bankInfoService','$modal', 'toaster', 'bankTransferService', '$filter', 'ngTableParams', 'BaseService', 'OrderSimpleInfo', '$state', '$stateParams', 'Order', 'SmoothScroll', 'EncryptionService', function($scope, $rootScope, $anchorScroll, $location,SessionService, bankInfoService, $modal, toaster, bankTransferService, $filter, ngTableParams, BaseService, OrderSimpleInfo, $state, $stateParams, Order, SmoothScroll, EncryptionService) {
+        BaseService.scrollBackToTop();
+
+        $scope.type = "PAIDTOPLATFORM";
+        $scope.orderList = '';
+        if($stateParams.orderid) {
+            Order.get({orderid : $stateParams.orderid}, function(data) {
+                var arr = new Array();
+                $scope.$$bankTransfer = {};
+                $scope.$$bankTransfer.total = 0.0;
+                for(var i = 0; i < data.length; i++) {
+                    arr.push(data[i].orderid);
+                    $scope.$$bankTransfer.total = $scope.$$bankTransfer.total + data[i].ensurePrice;
+                }
+                $scope.$$bankTransfer.currency =  data[0].currency;
+                $scope.orderNum = arr.join(',');
+                $scope.orderList = arr;
+
+                // 日期换算
+                $scope.availabletime = '';
+                $scope.availabletime = data[0].availabletime;
+                $scope.creattime = '';
+                $scope.creattime = data[0].creattime;
+                var SurplusTime = $scope.availabletime - $scope.creattime;
+            }, function (response) {
+                toaster.pop('info', '获取订单的信息有误,请确定付款的订单');
+            })
+        }else {
+            $state.go('buyer_order');
+        }
+        
+        $scope.purKind = $rootScope.userInfo.enterprises ? false : true;//应付账户的类别, 默认是企业
+        $scope.saleKind = false;//应收账户的类别,默认是企业
+        var ids=SessionService.get("ids");
+
+        var page = Number(SessionService.get("page")) || 1;
+        var count = Number(SessionService.get("count")) || 20;
+        SessionService.unset("ids");
+        SessionService.unset("page");
+        SessionService.unset("count");
+        var hideBankFilter = $filter("hideBankFilter");
+        $scope.isSelectAll = false;
+        $scope.isSelect = false;
+        $scope.orderArray = []; //存放订单链
+        $scope.total = 0;
+        $scope.currencyName = ''; //存放当前币别
+
+        $scope.nowTime = new Date().getTime();
+
+        //解析数据,从返回的数据中找到要解析的数据
+        var resolveData = function(data) {
+            var arr = new Array();
+            for(var key in data) {
+                var numb= Number(key);
+                if(angular.isNumber(numb)&&(!isNaN(numb))) {
+                    arr.push(data[key]);
+                }
+            }
+            return arr;
+        };
+
+        //获取管理平台账户信息
+        var getOriginalData = function(data) {
+            var result = {};
+            if(data&&data.length) {
+                result = data[0];
+            }else {
+                result = null;
+            }
+            return result;
+        };
+        var getSellerAccount = function() {
+            bankInfoService.getAdminEnterAccount('', function(data) {
+                $scope.saleAccountInfos = resolveData(data);
+                angular.forEach($scope.saleAccountInfos, function(saleAccountInfo) {
+                    saleAccountInfo.filterAccount = hideBankFilter(saleAccountInfo.number);
+                });
+                $scope.saleAccount = getOriginalData($scope.saleAccountInfos);
+            }, function(res) {
+                toaster.pop('error', '错误', '获取卖家企业账户信息失败');
+            });
+        };
+        getSellerAccount();
+
+        // 确认订单
+        //订单加密解析器
+        var enIdFilter = $filter('EncryptionFilter');
+        $scope.confirmOrder = function () {
+            $state.go('order_transfer', {orderid : $stateParams.orderid});
+        };
+
+        $scope.buyExpose = false;
+        $scope.salexpose = false;
+        //expose代表展开的状态,isBuyd代表当前操作的数据
+        $scope.doExpose = function(expose, isBuy) {
+            if(isBuy) {
+                $scope.buyExpose = expose;
+            }else {
+                $scope.salexpose = expose;
+            }
+        }
+
+        //获取当前时间
+        var getTodayDate = function(){
+            var date = new Date();
+            $scope.maxDate = date;
+        };
+        getTodayDate();
+    }]);
+    /**
+     * 与现在的时间对比,距离多少天多少小时
+     */
+    app.register.filter('restTime', function () {
+        var day = 0, hours = 0, minute = 0;
+        return function (time) {
+            if(!time) {
+                return null;
+            }
+            var nowTime = new Date();
+            var s1 = time - nowTime.getTime();
+            var totalHours = s1/(1000*60*60);//算多少个小时
+            day = parseInt(totalHours) / 24;
+            hours = parseInt(totalHours) % 24;
+            minute = parseInt(hours)% 60;
+            return parseInt(day) + "天" + parseInt(hours) + "小时";
+        }
+    });
+
+    /**
+     * totalHours传入小时,被减去minuesTime转换成天数
+     * 返回格式时  x天y小时
+     */
+    app.register.filter('hoursToDay', function () {
+        var day = 0, hours = 0;
+        return function (totalHours, minuesdTime) {
+            var h = minuesdTime - totalHours;
+            day = parseInt(h) / 24;
+            hours = parseInt(h) % 24;
+            return "还剩 " + parseInt(day) + "天" + parseInt(hours) + "小时";
+        }
+    });
+});

+ 1 - 0
src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_home_ctrl.js

@@ -5,6 +5,7 @@
 define(['app/app', 'calendar'], function(app) {
     app.register.controller('homeCtrl', ['$scope', '$rootScope', 'Recommendation', 'ShippingAddress', 'Bill', '$q', 'toaster', '$modal', 'Goods', 'StoreInfo', function ($scope, $rootScope, Recommendation, ShippingAddress, Bill, $q, toaster, $modal, Goods, StoreInfo) {
         $rootScope.active = 'home';
+        document.title='买家中心-优软商城';
         var getRecommendComps = function (userUU, usedFor, pageable) {
             Recommendation.getRecommendComps({page: pageable.page, size: pageable.size}, function (data) {
                 $scope.recommendComps = data.content;

+ 1 - 0
src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_invoice_ctrl.js

@@ -7,6 +7,7 @@ define(['app/app'], function(app) {
     app.register.controller('invoiceCtrl', ['$scope', '$rootScope', 'toaster', '$modal', '$q', 'Bill', '$upload', '$http', '$location', '$stateParams', '$state', function($scope, $rootScope, toaster, $modal, $q, Bill, $upload, $http, $location, $stateParams, $state) {
         $rootScope.active = 'buyer_invoice';
         $scope.tab = 'buyer_invoice';
+        document.title = '开票信息-优软商城';
         $scope.invoiceType = 1205;
         $scope.isSpecial = true; //专票,等于true为不存在
         $scope.isNormal = true; //普票,等于true为不存在

+ 1 - 1
src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_invoice_record_ctrl.js

@@ -5,7 +5,7 @@ define([ 'app/app' ], function(app) {
         // 开票申请
         $scope.keyword = '';
         $scope.invoiceType = '';
-
+        document.title = '开票记录-优软商城';
         var initDataRule = function () {
             $scope.param = {
                 page: 1,

+ 2 - 1
src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_no_invoice_ctrl.js

@@ -2,7 +2,7 @@ define([ 'app/app' ], function(app) {
     'use strict';
     app.register.controller('NoInvoiceCtrl', ['$scope','$rootScope','$modal', 'Order', 'toaster','ngTableParams','BaseService','Bill', function ($scope, $rootScope, $modal, Order, toaster, ngTableParams, BaseService, Bill) {
         $scope.tab = 'buyer_no_invoice';
-
+        document.title = '未开票订单-优软商城';
         // 开票申请
         $scope.applyInvoice = function () {
             var applyItem = [];
@@ -61,6 +61,7 @@ define([ 'app/app' ], function(app) {
                     // param.pageParams.sorting = {creattime : "DESC"};
                     param.keyword = $scope.keyword;
                     Order.getOrderOnBillByPersonal(param, function (page) {
+                        $scope.isAllCheck = false;
                         $scope.$$kdnData.totalElements = page.totalElements;
                         if(Number(page.totalElements) > 0) {
                             $scope.$$kdnData.start = Number(page.size) * (Number(page.number) - 1) + 1;

+ 61 - 2
src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_order_ctrl.js

@@ -6,6 +6,7 @@ define(['app/app'], function (app) {
 	'use strict';
 	app.register.controller('orderCtrl', ['$scope', '$rootScope', 'Order', 'toaster', '$filter', 'OrderSimpleInfo', 'Recommendation', '$modal', 'tradeMessageNoticeService', 'tradeBasicProperties', 'NumberService', 'ChatBusinessLayer','Rate', function($scope, $rootScope, Order, toaster, $filter, OrderSimpleInfo, Recommendation, $modal, tradeMessageNoticeService, tradeBasicProperties, NumberService, ChatBusinessLayer,Rate) {
 
+		document.title = '已买到的产品-优软商城';
 		//初始化数据
 		$rootScope.active = 'buyer_order';
 		$scope.param = {};
@@ -78,9 +79,9 @@ define(['app/app'], function (app) {
 			var state = null;
 			switch($scope.status) {
 				case 'all' : // 全部
-					state = '503-504-505-406-407-403-408-404-405-520-523-522-602-603-315-604-605-606'; break;
+					state = '503-504-524-525-505-406-407-403-408-404-405-520-523-522-602-603-315-604-605-606'; break;
 				case 'tobepaid' : // 待付款
-					state = '503-504'; break; // 504-已付款, 放在待付款下面,商城确认收款后再放到待发货
+					state = '503-504-524-525'; break; // 504-已付款, 放在待付款下面,商城确认收款后再放到待发货
 				case 'tobedeliver' : // 待发货
 					state = '505-406-407-403-408'; break;
 				case 'tobereceive' : // 待收货
@@ -177,6 +178,28 @@ define(['app/app'], function (app) {
 				$scope.accumulateNotifyTime($scope.currenctOrders);
 				$scope.param.currentPage = data.number;
 				$scope.acculatePages(data.number, data.totalPages);
+
+				angular.forEach($scope.currenctOrders, function (data) {
+					// 循环判断一期都没有付款并且延期的
+					if (data.installmentId && data.installment.status == 503) {
+						angular.forEach(data.installment.installmentDetails, function (detailslist) {
+							var nowTime = new Date();
+							if (detailslist.status == 503 && nowTime.getTime() > detailslist.deadline){
+								data.Overtime = true;
+							}
+						})
+					}
+					if (data.installmentId && data.installment.status == 504) {
+						angular.forEach(data.installment.installmentDetails, function (detailslist) {
+							if (detailslist.status == 504) {
+								data.againUpload = true;
+							}
+						})
+					}
+					// 循环判断已付款未收款卖家可取消的
+
+				});
+
 			}, function(response) {
 				toaster.pop('error', '获取订单失败,请重新刷新界面,' + response.data);
 			});
@@ -276,6 +299,38 @@ define(['app/app'], function (app) {
 			loadData();
 		};
 
+		// 同意卖家取消订单
+		$scope.requestCancelBox = false;
+		$scope.requestCancel = function (item, id) {
+			$scope.requestCancelBox = true;
+			$scope.cancleOrder = {};
+			$scope.cancleOrder = item;
+		};
+		$scope.cancelRequestCancelBox = function () {
+			$scope.requestCancelBox = false;
+		};
+		// 同意取消
+		$scope.confirmRequest = function () {
+			OrderSimpleInfo.userAuditCancelOrder({orderid: $scope.cancleOrder.orderid},null, function () {
+				toaster.pop('success', '已同意卖家取消订单申请');
+				$scope.requestCancelBox = false;
+				loadData();
+			}, function (response) {
+				toaster.pop('error', response.data);
+				$scope.requestCancelBox = false;
+			});
+		};
+		// 拒绝取消
+		$scope.cancelRequest = function () {
+			OrderSimpleInfo.userUnauditCancelOrder({orderid: $scope.cancleOrder.orderid},null, function () {
+				toaster.pop('success', '已拒绝卖家取消订单申请');
+				loadData();
+				$scope.requestCancelBox = false;
+			}, function (response) {
+				toaster.pop('error', response.data);
+				$scope.requestCancelBox = false;
+			});
+		};
 		/**
 		 * 取消订单
 		 * @param id 传入的订单id
@@ -676,11 +731,15 @@ define(['app/app'], function (app) {
 				case 501:
 				case 502:
 				case 503:
+                case 524:
 					result = '待付款';
 					break;
 				case 504:
 					result = '付款确认中';
 					break;
+				case 525:
+					result = '卖家请求取消';
+					break;
 				case 505:
 				case 406:
 				case 407:

+ 405 - 122
src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_transfer_ctrl.js

@@ -1,46 +1,249 @@
 define([ 'app/app' ], function(app) {
-	
-	app.register.controller('buyerTransferCtrl', ['$scope', '$rootScope', '$anchorScroll', '$location','SessionService', 'bankInfoService','$modal', 'toaster', 'bankTransferService', '$filter', 'ngTableParams', 'BaseService', 'OrderSimpleInfo', '$state', '$stateParams', 'Order', 'SmoothScroll', 'EncryptionService', function($scope, $rootScope, $anchorScroll, $location,SessionService, bankInfoService, $modal, toaster, bankTransferService, $filter, ngTableParams, BaseService, OrderSimpleInfo, $state, $stateParams, Order, SmoothScroll, EncryptionService) {
+
+	app.register.controller('buyerTransferCtrl', ['$scope', '$rootScope', '$anchorScroll', '$location','SessionService', 'bankInfoService','$modal', 'toaster', 'bankTransferService', '$filter', 'ngTableParams', 'BaseService', 'OrderSimpleInfo', '$state', '$stateParams', 'Order', 'SmoothScroll', 'EncryptionService','NumberService' ,'$timeout', function($scope, $rootScope, $anchorScroll, $location,SessionService, bankInfoService, $modal, toaster, bankTransferService, $filter, ngTableParams, BaseService, OrderSimpleInfo, $state, $stateParams, Order, SmoothScroll, EncryptionService, NumberService, $timeout) {
 		BaseService.scrollBackToTop();
 
+		document.title = '线下付款-优软商城';
+		$scope.diliverPrice = [''];
+		$scope.type = "PAIDTOPLATFORM";
+		// $scope.type = "PAIDTOVENDOR";
+		$scope.selectPaymentType = function (type) {
+			$scope.type = type;
+			// console.log($scope.type);
+		};
 		if($stateParams.orderid) {
 			Order.get({orderid : $stateParams.orderid}, function(data) {
-				console.log(data);
-				var arr = new Array();
-				$scope.$$bankTransfer = {};
-				$scope.$$bankTransfer.total = 0.0;
+				var arr = [];
+				$scope.$$bankTransfer = data[0];
+
+				getSellerAccount();
+				// 分期信息
+				if ($scope.$$bankTransfer.installmentId){
+					$scope.installmentData = data[0].installment;
+					// 获取没有付款的期数
+					$scope.yesPayinstallmentDetails = [];
+					$scope.noPayinstallmentDetails = [];
+					if ($scope.installmentData.status == 504){
+						angular.forEach($scope.installmentData.installmentDetails, function (item) {
+							if (item.status == 505) {
+								$scope.yesPayinstallmentDetails.push(item);
+								item.installmentImages = item.imgs.split(",");
+								item.imgIndex = 0;
+								// 已付款价格
+								$scope.yesPayinstallmentDetails.payTatalPrice = 0;
+								angular.forEach($scope.yesPayinstallmentDetails, function (item) {
+									$scope.yesPayinstallmentDetails.payTatalPrice += item.price;
+								});
+							}else if(item.status == 504){
+								$scope.noPayinstallmentDetails.push(item);
+								item.installmentImages = item.imgs.split(",");
+
+								// 存放当前未付款图片
+								$scope.arrList = item.installmentImages;
+                                $scope.diliverPrice = item.pricesArr.split(',');
+								$scope.installmentNoPayImg = [];
+								angular.forEach($scope.arrList, function (data) {
+									$scope.installmentNoPayImg.push({imageUrl: data})
+								});
+							}
+						})
+					}
+				}
+				if ($scope.$$bankTransfer.installmentId) {
+					$scope.type = "PAIDTOVENDOR";
+				}
+				$scope.$$bankTransfer.total = 0;
 				for(var i = 0; i < data.length; i++) {
-					arr.push(data[i].orderid);
-					$scope.$$bankTransfer.total = $scope.$$bankTransfer.total + data[i].ensurePrice;
+					var item = data[i];
+					arr.push(item.orderid);
+					$scope.$$bankTransfer.total += item.ensurePrice;
 				}
-				$scope.$$bankTransfer.currency =  data[0].currency;
 				$scope.orderNum = arr.join(',');
+                // $scope.installmentData
+
 			}, function (response) {
 				toaster.pop('info', '获取订单的信息有误,请确定付款的订单');
 			})
 		}else {
 			$state.go('buyer_order');
 		}
+		// 取消
+        $scope.loadPage = function () {
+            $state.go('buyer_order');
+        };
+		// 分期付款功能开发
+		$scope.loadPersonal = function () {
+			bankInfoService.getBuyPersonalBank('', function(data) {
+				$scope.buyAccountInfos = resolveData(data.content);
+				angular.forEach($scope.buyAccountInfos, function(buyAccountInfo) {
+					buyAccountInfo.filterAccount = hideBankFilter(buyAccountInfo.number);
+				});
+				$scope.buyAccount = getOriginalData($scope.buyAccountInfos);
+			}, function(error) {
+				toaster.pop('error', '错误', '提取个人账户信息失败');
+			});
+		};
+		$scope.loadPersonal();
+		// 更换账户
+		$scope.changebuyAccountBox = false;
+		$scope.changebuyAccount = function () {
+			$scope.changebuyAccountBox = true;
+		};
+		$scope.buyerLists = {};
+		$scope.selectItem = function (item) {
+			angular.forEach($scope.buyAccountInfos, function (data) {
+				if(data.id != item.id) {
+					data.isFalse = false;
+				}
+			});
+			$scope.buyerLists = $scope.buyAccountInfos;
+			item.isFalse = !item.isFalse;
+		};
+		$scope.confirmChange = function (){
+			$scope.changebuyAccountBox = false;
+			angular.forEach($scope.buyerLists, function (item) {
+				if (item.isFalse == true) {
+					$scope.buyAccount = item;
+				}
+			});
+		};
+		// 取消
+		$scope.cancelChange = function () {
+			$scope.changebuyAccountBox = false;
+		};
+		// 上传图片
+		$scope.imagesList = [{imageUrl: ''}];
+		// 循环水单价格
+		$scope.waterPriceList = [{price: ''}];
+		$scope.addUploadImg = function () {
+			$scope.imagesList.push({imageUrl: ''});
+			document.onclick = function () {}
+			$scope.diliverPrice.push('');
+			$scope.waterPriceList.push({price: ''});
+			var id = 'uploadImg-'+($scope.imagesList.length-1);
+			$timeout(function(){
+				angular.element('#'+id+' input').click();
+			},1);
+		};
+		// 删除图片
+		$scope.deleteProofInfo = function (index) {
+			// if ($scope.imagesList.length == 1) {
+			// 	$scope.imagesList[index].imageUrl = '';
+			// } else {
+			// 	$scope.imagesList.splice(index, 1);
+			// }
+			$scope.imagesList[index] = {};
+			// console.log($scope.imagesList);
+		};
+		$scope.deleteimg = function (index) {
+			$scope.installmentNoPayImg[index] = {};
+		};
+
+		$scope.addUploadImgNopay = function (event) {
+			// 订单中心的document点击事件
+			document.onclick = function () {}
+
+			$scope.installmentNoPayImg.push({imageUrl: ''});
+			var id = 'upload-'+($scope.installmentNoPayImg.length-1);
+			console.log(id);
+			$timeout(function(){
+				angular.element('#'+id+' input').click();
+			},1);
+		};
+		/**
+		 * 上传付款截图
+		 */
+		$scope.onUploadPayment = function ($data, index) {
+			if (!$data || !$data.path) {
+				toaster.pop('error', '您还没有上传新的单据');
+				return ;
+			}
+			var id = 'uploadImg-'+($scope.imagesList.length-1);
+			$timeout(function(){
+				angular.element('#'+id+' input').click();
+			},1);
+			$scope.imageUrl = $data.path;
+			$scope.imagesList[index].imageUrl = $scope.imageUrl;
+			// console.log($scope.imagesList);
+		};
+		$scope.onUploadPaymentImg = function ($data, index) {
+			if (!$data || !$data.path) {
+				toaster.pop('error', '您还没有上传新的单据');
+				return ;
+			}
+			$scope.imageUrl = $data.path;
+			$scope.installmentNoPayImg[index].imageUrl = $scope.imageUrl;
+		};
+		/**
+		 * 查看大图
+		 *
+		 * @param imgUrl		图片链接
+		 */
+		$scope.showImg = showImg;
+		function showImg(imgUrl) {
+			var src = imgUrl, box = $('#image-box'), modal = $('.modal-content');
+			box.show();
+			box.find('img').attr('src', src);
+			box.find('a').click(function(){
+				box.hide();
+			});
+			box.dblclick(function(){
+				box.hide();
+			});
+		}
 
+		// 分期明细
+		$scope.numArray = {
+			'1': '一',
+			'2': '二',
+			'3': '三',
+			'4': '四',
+			'5': '五'
+		};
+
+		// 切换效果
+		$scope.changeImg = function (installmentImg, index) {
+			angular.forEach(installmentImg.installmentImages, function (data,a) {
+				if (index == a){
+					installmentImg.imgIndex = a;
+				}
+			});
+		};
+		$scope.changePrev = function (installmentImg) {
+			if (installmentImg.imgIndex == 0) {
+				installmentImg.imgIndex = 0
+			}else if(installmentImg.imgIndex > 0){
+				installmentImg.imgIndex -= 1;
+			}
+		};
+		$scope.changeNext = function (installmentImg, index) {
+			if (installmentImg.imgIndex == installmentImg.installmentImages.length-1) {
+				installmentImg.imgIndex = 0
+			}else {
+				installmentImg.imgIndex += 1;
+			}
+		};
+		//controller
+		// 分期付款结束
 		$scope.purKind = $rootScope.userInfo.enterprises ? false : true;//应付账户的类别, 默认是企业
 		$scope.saleKind = false;//应收账户的类别,默认是企业
 		var ids=SessionService.get("ids");
-		
+
 		var page = Number(SessionService.get("page")) || 1;
 		var count = Number(SessionService.get("count")) || 20;
 		SessionService.unset("ids");
 		SessionService.unset("page");
 		SessionService.unset("count");
 		var hideBankFilter = $filter("hideBankFilter");
-		
+
 		$scope.isSelectAll = false;
 		$scope.isSelect = false;
 		$scope.orderArray = []; //存放订单链
 		$scope.total = 0;
 		$scope.currencyName = ''; //存放当前币别
-		
+
 		$scope.nowTime = new Date().getTime();
-		
+
 		//解析数据,从返回的数据中找到要解析的数据
 		var resolveData = function(data) {
 			var arr = new Array();
@@ -52,7 +255,7 @@ define([ 'app/app' ], function(app) {
 			}
 			return arr;
 		};
-		
+
 		$scope.pay = function(order) {
 			if(order.availabletime < new Date().getTime()) {
 				toaster.pop("error", '错误', '此订单已过期,已失效');
@@ -65,14 +268,14 @@ define([ 'app/app' ], function(app) {
 			$scope.showMe = true;
 			SmoothScroll.scrollTo(null, 'O', -68);
 		};
-		
+
 		//返回修改
 		$scope.alterPay = function() {
 			$location.hash('toptip');
 			$anchorScroll();
 			$scope.showMe = false;
-		}
-		
+		};
+
 		$scope.batchPay = function() {
 			if(!$scope.orderNum) {
 				toaster.pop("error", '错误', '请选择要付款的单');
@@ -82,7 +285,7 @@ define([ 'app/app' ], function(app) {
 			$anchorScroll();
 			$scope.showMe = true;
 		};
-		
+
 		var getOriginalData = function(data) {
 			var result = {};
 			if(data&&data.length) {
@@ -92,7 +295,7 @@ define([ 'app/app' ], function(app) {
 			}
 			return result;
 		};
-		
+
 		$scope.selectAll = function() {
 			$scope.isSelectAll = !$scope.isSelectAll;
 			$scope.orderArray = [];
@@ -121,7 +324,7 @@ define([ 'app/app' ], function(app) {
 			}
 			$scope.orderNum = $scope.orderArray.join(',');
 		};
-		
+
 		$scope.doSelect = function(order) {
 			var result = true;
 			if(order.isSelect) {
@@ -166,61 +369,71 @@ define([ 'app/app' ], function(app) {
 			$scope.isSelectAll = result;
 			$scope.orderNum = $scope.orderArray.join(',');
 		}
-		
-		//根据单选框的状态,提取不同的数据
-		var getBuyAccount = function() {
-			if(!$scope.purKind) {
-				bankInfoService.getBuyEnterpriseBank('', function(data) {
-					$scope.buyAccountInfos = resolveData(data);
-					angular.forEach($scope.buyAccountInfos, function(buyAccountInfo) {
-						buyAccountInfo.filterAccount = hideBankFilter(buyAccountInfo.number);
-					});
-					$scope.buyAccount = getOriginalData($scope.buyAccountInfos);
-				}, function(error) {
-					toaster.pop('error', '错误', '提取企业账户信息失败');
-				});
-			}else {
-				bankInfoService.getBuyPersonalBank('', function(data) {
-					$scope.buyAccountInfos = resolveData(data);
-					angular.forEach($scope.buyAccountInfos, function(buyAccountInfo) {
-						buyAccountInfo.filterAccount = hideBankFilter(buyAccountInfo.number);
-					});
-					$scope.buyAccount = getOriginalData($scope.buyAccountInfos);
-				}, function(error) {
-					toaster.pop('error', '错误', '提取个人账户信息失败');
-				});
-			}
-		};
-		
-		//开始时,就获取账户信息
-		getBuyAccount();
-		
+
+		// //根据单选框的状态,提取不同的数据
+		// var getBuyAccount = function() {
+		// 	if(!$scope.purKind) {
+		// 		bankInfoService.getBuyEnterpriseBank('', function(data) {
+		// 			$scope.buyAccountInfos = resolveData(data);
+		// 			angular.forEach($scope.buyAccountInfos, function(buyAccountInfo) {
+		// 				buyAccountInfo.filterAccount = hideBankFilter(buyAccountInfo.number);
+		// 			});
+		// 			$scope.buyAccount = getOriginalData($scope.buyAccountInfos);
+		// 		}, function(error) {
+		// 			toaster.pop('error', '错误', '提取企业账户信息失败');
+		// 		});
+		// 	}else {
+		// 		bankInfoService.getBuyPersonalBank('', function(data) {
+		// 			$scope.buyAccountInfos = resolveData(data);
+		// 			angular.forEach($scope.buyAccountInfos, function(buyAccountInfo) {
+		// 				buyAccountInfo.filterAccount = hideBankFilter(buyAccountInfo.number);
+		// 			});
+		// 			$scope.buyAccount = getOriginalData($scope.buyAccountInfos);
+		// 		}, function(error) {
+		// 			toaster.pop('error', '错误', '提取个人账户信息失败');
+		// 		});
+		// 	}
+		// };
+		//
+		// //开始时,就获取账户信息
+		// getBuyAccount();
+
 		//获取管理平台账户信息
 		var getSellerAccount = function() {
-			if(!$scope.saleKind) {
-				bankInfoService.getAdminEnterAccount('', function(data) {
-					$scope.saleAccountInfos = resolveData(data);
-					angular.forEach($scope.saleAccountInfos, function(saleAccountInfo) {
-						saleAccountInfo.filterAccount = hideBankFilter(saleAccountInfo.number);
-					});
-					$scope.saleAccount = getOriginalData($scope.saleAccountInfos);
-				}, function(res) {
-					toaster.pop('error', '错误', '获取卖家企业账户信息失败');
+			// 平台账户
+			bankInfoService.getAdminEnterAccount('', function(data) {
+				$scope.saleAccountInfos = resolveData(data);
+				console.log($scope.saleAccountInfos);
+				angular.forEach($scope.saleAccountInfos, function(saleAccountInfo) {
+					saleAccountInfo.filterAccount = hideBankFilter(saleAccountInfo.number);
 				});
-			}else {
-				bankInfoService.getAdminPersAccount('', function(data) {
-					$scope.saleAccountInfos = resolveData(data);
-					angular.forEach($scope.saleAccountInfos, function(saleAccountInfo) {
-						saleAccountInfo.filterAccount = hideBankFilter(saleAccountInfo.number);
-					});
-					$scope.saleAccount = getOriginalData($scope.saleAccountInfos);
-				}, function(res) {
-					toaster.pop('error', '错误', '获取卖家个人账户信息失败');
+				$scope.saleAccount = getOriginalData($scope.saleAccountInfos);
+			}, function(res) {
+				toaster.pop('error', '错误', '获取卖家企业账户信息失败');
+			});
+			// 卖家私人账户
+			// bankInfoService.getAdminPersAccount('', function(data) {
+			// 	$scope.saleAccountInfos = resolveData(data);
+			// 	angular.forEach($scope.saleAccountInfos, function(saleAccountInfo) {
+			// 		saleAccountInfo.filterAccount = hideBankFilter(saleAccountInfo.number);
+			// 	});
+			// 	$scope.salePerAccount = getOriginalData($scope.saleAccountInfos);
+			// }, function(res) {
+			// 	toaster.pop('error', '错误', '获取卖家个人账户信息失败');
+			// });
+			//
+			bankInfoService.getSaleEeterprise({enuu: $scope.$$bankTransfer.sellerenuu},{}, function(data) {
+				$scope.saleAccountInfos = resolveData(data);
+				angular.forEach($scope.saleAccountInfos, function(saleAccountInfo) {
+					saleAccountInfo.filterAccount = hideBankFilter(saleAccountInfo.number);
 				});
-			}
-		}
-		
-		getSellerAccount();
+				$scope.salePerAccount = getOriginalData($scope.saleAccountInfos);
+			}, function(res) {
+				toaster.pop('error', '错误', '获取卖家个人账户信息失败');
+			});
+		};
+
+		// getSellerAccount();
 
 		$scope.set = function(data, isBuy) {
 			if(isBuy) {
@@ -236,7 +449,7 @@ define([ 'app/app' ], function(app) {
 			}
 
 		};
-		
+
 		// 搜索框内容转换成大写
 		var t;
 		var setTime = function() {
@@ -251,19 +464,19 @@ define([ 'app/app' ], function(app) {
 				$scope.keyword = angular.uppercase($scope.keyword);
 			}
 		};
-		
+
 		$scope.upper = function() {
 			$scope.time = 1;
 			clearTimeout(t);
 			setTime();
 		}
-		
+
 		// 根据搜索框输入信息搜索对应订单
 		$scope.searchFor = function() {
 			$scope.keyword = angular.uppercase($scope.keyword);
 			$scope.tobePaidTableParams.reload();
 		}
-		
+
 		$scope.tobePaidTableParams = new ngTableParams({
 			page : page,
 			count : count,
@@ -286,7 +499,7 @@ define([ 'app/app' ], function(app) {
 					$scope.orderNum = ""; //单号的链接字符串
 					$scope.orderArray = []; //存放
 					$scope.total = 0;
-					
+
 					if(ids) {
 						var arr = ids.split('-');
 						var result = true;
@@ -303,7 +516,7 @@ define([ 'app/app' ], function(app) {
 							if(!order.isSelect) {
 								result = false;
 							}
-						});				
+						});
 						$scope.isSelectAll = result;
 						$scope.orderNum = $scope.orderArray.join(',');
 						if($scope.orderNum) {
@@ -313,7 +526,7 @@ define([ 'app/app' ], function(app) {
 				});
 			}
 		});
-		
+
 		//跳出模态框,data有数据代表编辑,data为空则代表新增。
 		$scope.bankInfo = function(data) {
 			var modalInstance = $modal.open({
@@ -326,7 +539,7 @@ define([ 'app/app' ], function(app) {
 				}
 			});
 		};
-		
+
 		//新增账户
 		$scope.newAccount = function(data) {
 			var modalInstance = $modal.open({
@@ -343,7 +556,7 @@ define([ 'app/app' ], function(app) {
 					}
 				}
 			});
-			
+
 			modalInstance.result.then(function(account) {
 				if(account.kind) {
 					bankInfoService.saveBuyPersonalBank({}, account, function(data) {
@@ -364,10 +577,10 @@ define([ 'app/app' ], function(app) {
 					});
 				}
 			}, function() {
-				
+
 			});
 		};
-		
+
 		$scope.deleteAccount = function(buyAccount) {
 			var  isSure = confirm('确认删除本银行账户?删除后无法恢复,请谨慎操作');
 			if(isSure){
@@ -379,51 +592,121 @@ define([ 'app/app' ], function(app) {
 				})
 			}
 		}
-		
+
+		$scope.onDiliverPriceChange = function (index) {
+			if (!($scope.diliverPrice[index] > 0)) {
+				$scope.diliverPrice[index] = '';
+				toaster.pop('info', '提示', '分期金额必须大于0');
+			}
+		}
+
+
 		$scope.confirm = function() {
+			var imageArray = [];
+			if ($scope.$$bankTransfer.installmentId && $scope.noPayinstallmentDetails.length > 0) {
+				$scope.imagesList = $scope.installmentNoPayImg;
+			}
+			for (var i = 0; i< $scope.imagesList.length; i++) {
+				if ($scope.imagesList.length <= 6) {
+					if ($scope.imagesList[i].imageUrl && $scope.imagesList[i].imageUrl != '') {
+						if ($scope.type == "PAIDTOVENDOR" && $scope.diliverPrice[i] == '') {
+							toaster.pop('info','提示','请输入付款截图下对应的付款金额');
+							return;
+						}
+						imageArray.push($scope.imagesList[i].imageUrl);
+					} else if ($scope.type == "PAIDTOVENDOR" && $scope.imagesList[i].imageUrl == '') {
+						toaster.pop('info','提示','请输入付款金额对应的付款截图');
+						return;
+					}
+				}
+			}
+			// console.log($scope.diliverPrice);
+			// console.log($scope.imagesList);
+			var str = imageArray.join(",");
 			if(angular.isUndefined($scope.orderNum) || angular.equals($scope.orderNum,'') || angular.equals($scope.$$bankTransfer.total, 0)) {
 				toaster.pop('info', '提示', '没有选择要付款的订单,或付款总额为0');
 				return ;
 			}
-			if(angular.isUndefined($scope.buyAccount)||angular.equals("{}", angular.toJson($scope.buyAccount))) {
+			if(angular.isUndefined($scope.buyAccount)||angular.equals("{}", angular.toJson($scope.buyAccount))  || $scope.buyAccount == null) {
 				toaster.pop('info', '提示', '请选择买家账户');
 				return ;
 			}
-			if(angular.isUndefined($scope.saleAccount)||angular.equals("{}", angular.toJson($scope.saleAccount))) {
-				toaster.pop('info', '提示', '请选择卖家账户');
+			if ($scope.type == 'PAIDTOVENDOR'){
+				$scope.saleAccount = $scope.salePerAccount;
+			}
+			if(angular.isUndefined($scope.saleAccount)||angular.equals("{}", angular.toJson($scope.saleAccount)) || $scope.saleAccount == null) {
+				if ($scope.type == 'PAIDTOVENDOR') {
+					toaster.pop('info', '提示', '尚未选择收款账户,请联系卖家处理');
+				} else {
+					toaster.pop('info', '提示', '请选择卖家账户');
+				}
 				return ;
 			}
-			if(!$scope.transferTime) {
-				toaster.pop('info', '提示', '请选择付款日期');
+			if(!str || str == ''){
+				toaster.pop('info', '提示', '请选择付款截图');
 				return ;
 			}
-			if(!$scope.imageUrl){
-                toaster.pop('info', '提示', '请选择付款截图');
-                return ;
-            }
+
+			if ($scope.type == "PAIDTOVENDOR") {
+				var firstItem = {};
+				var firstFlag = false;
+				angular.forEach($scope.installmentData.installmentDetails, function (item) {
+					if (!firstFlag) {
+						if (item.status != 505) {
+							firstItem = item;
+							firstFlag = true;
+						}
+					}
+				});
+
+				var tmpPrice = 0;
+				angular.forEach($scope.diliverPrice, function (item) {
+					if (item != '') {
+						tmpPrice = NumberService.add(tmpPrice, parseFloat(item));
+					}
+				})
+
+				if (firstItem.price != tmpPrice) {
+					toaster.pop('info', '提示', '付款金额为空或不等于分期金额,请重新确认');
+					return;
+				}
+			}
+
+			var transfer = {};
+			if ($scope.$$bankTransfer.installment){
+				var installmentDetailId = '';
+				angular.forEach($scope.$$bankTransfer.installment.installmentDetails, function (installmentDetail) {
+					if (installmentDetail.detno == $scope.$$bankTransfer.installment.currentNo)
+						installmentDetailId = installmentDetail.id;
+				})
+				transfer.installmentDetailId = installmentDetailId;
+			};
+
 			var buyAccount = angular.copy($scope.buyAccount);
 			var saleAccount = angular.copy($scope.saleAccount);
 			delete saleAccount.filterAccount;
 			delete buyAccount.filterAccount;
 			var jsonPament = angular.toJson(buyAccount);
 			var jsonReceive = angular.toJson(saleAccount);
-			var transfer = {};
 			transfer.jsonPament = jsonPament;
 			transfer.jsonReceive = jsonReceive;
-			transfer.imgUrl = $scope.imageUrl;
-			transfer.transferTime = $scope.transferTime.getTime();
+			// console.log(transfer.jsonReceive)
+			transfer.imgUrl = str;
+			transfer.type = $scope.type;
+			// transfer.transferTime = $scope.transferTime.getTime();
 			transfer.total = $scope.$$bankTransfer.total;
+            transfer.pricesArr = $scope.diliverPrice.join(',');
 			bankTransferService.saveTransfer({order: $scope.orderNum.split(',').join('-')}, transfer, function(data) {
-				toaster.pop('success', '信息保存成功');
+				toaster.pop('success', '提交成功');
 				$state.go('buyer_order');
 			}, function(response) {
-				toaster.pop("error", '失败', '信息保存失败:' + response.data);
+				toaster.pop("error", '失败', '提交失败:' + response.data);
 			});
 		}
 
 		$scope.buyExpose = false;
 		$scope.salexpose = false;
-		//expose代表展开的状态,isBuyd代表当前操作的数据
+		//expose代表展开的状态,isBuy代表当前操作的数据
 		$scope.doExpose = function(expose, isBuy) {
 			if(isBuy) {
 				$scope.buyExpose = expose;
@@ -432,16 +715,16 @@ define([ 'app/app' ], function(app) {
 			}
 		}
 
-        /**
-         * 上传付款截图
-         */
-        $scope.onUploadPayment = function ($data) {
-            if (!$data || !$data.path) {
-                toaster.pop('error', '付款截图上传失败');
-                return ;
-            }
-            $scope.imageUrl = $data.path;
-        };
+		// /**
+		//  * 上传付款截图
+		//  */
+		// $scope.onUploadPayment = function ($data) {
+		//     if (!$data || !$data.path) {
+		//         toaster.pop('error', '付款截图上传失败');
+		//         return ;
+		//     }
+		//     $scope.imageUrl = $data.path;
+		// };
 
 		$scope.select = function(account, isBuy) {
 			if(isBuy) {
@@ -450,7 +733,7 @@ define([ 'app/app' ], function(app) {
 				$scope.saleAccount = account;
 			}
 		}
-		
+
 		//获取当前时间
 		var getTodayDate = function(){
 			var date = new Date();
@@ -458,7 +741,7 @@ define([ 'app/app' ], function(app) {
 		};
 		getTodayDate();
 	}]);
-	
+
 	app.register.controller('timeCtrl', ['$scope', '$modalInstance', function($scope, $modalInstance) {
 		$scope.time = 5;
 		var setTime = function() {
@@ -473,19 +756,19 @@ define([ 'app/app' ], function(app) {
 				$scope.closeNow();
 			}
 		};
-		
+
 		setTime();
-		
+
 		$scope.closeNow = function() {
 			$modalInstance.close($scope.time);
 		};
-		
+
 		$scope.dismiss = function() {
 			$modalInstance.dismiss();
 		};
 	}]);
-	
-	
+
+
 	app.register.controller('BankInfoCtrl', ['$scope', '$modalInstance', 'account', 'kind', function($scope, $modalInstance, account, kind){
 		$scope.account = account;
 		if($scope.account) {
@@ -502,22 +785,22 @@ define([ 'app/app' ], function(app) {
 			$scope.account = {};
 			$scope.account.currency = 'RMB'; // 默认银行卡币别是人民币
 		}
-		
+
 		$scope.set = function(kind) {
 			$scope.kind = kind;
 		}
-		
+
 		$scope.confirm = function() {
 			$scope.account.kind = $scope.kind;
 			$modalInstance.close($scope.account);
 		}
-		
+
 		$scope.cancel = function() {
 			$modalInstance.dismiss();
 		}
-		
+
 	}]);
-	
+
 	app.register.controller('ImageInsertCtrl', ['$scope', '$modalInstance', 'SmoothScroll', function($scope, $modalInstance, SmoothScroll) {
 		$scope.image = {src: null};
 		// 图片上传成功之后
@@ -529,12 +812,12 @@ define([ 'app/app' ], function(app) {
 				$scope.image.thumb = path;
 			});
 		};
-		
+
 		$scope.close = function() {
 			$modalInstance.dismiss();
 			SmoothScroll.scrollTo(null, 'O', -68);
 		};
-		
+
 		$scope.confirm = function() {
 			$modalInstance.close($scope.image);
 			$scope.imageUrl = null;

+ 1 - 1
src/main/webapp/resources/js/usercenter/controllers/forstore/first_rate_ctrl.js

@@ -1,7 +1,7 @@
 define(['app/app'], function(app) {
     'use strict';
     app.register.controller('firstRateCtrl', ['$scope', '$rootScope', '$stateParams','$filter','Order', 'toaster', 'Rate', function ($scope, $rootScope, $stateParams , $filter , Order , toaster , Rate) {
-
+        document.title = '初次评价-优软商城';
         $scope.isAnony = 1;
         $scope.goodsRate =[];
         $scope.vendorRate = {};

+ 1 - 0
src/main/webapp/resources/js/usercenter/controllers/forstore/order_detail_ctrl.js

@@ -3,6 +3,7 @@ define(['app/app'], function(app) {
 	"use strict";
 	app.register.controller('orderDetailCtrl', ['$scope', 'Order', 'Logistics', 'ComponentActive', 'toaster', '$stateParams', 'KdnLogistics', '$state', 'StoreInfo', 'NumberService', function($scope, Order, Logistics, ComponentActive, toaster, $stateParams, KdnLogistics, $state, StoreInfo, NumberService) {
 
+		document.title = '订单详情-优软商城';
 		// 保存订单编号信息
 		$scope.orderId = $stateParams.orderid;
 

+ 20 - 4
src/main/webapp/resources/js/usercenter/controllers/forstore/order_pay_ctrl.js

@@ -5,6 +5,7 @@
 define(['app/app'], function(app) {
 	app.register.controller('orderPayCtrl', ['$scope', '$rootScope', '$stateParams', '$modal', '$state', 'Bill', 'toaster', 'Order', '$filter', 'ShippingAddress', 'Ysepay', '$q', 'NumberService', 'Cart', '$timeout', 'DistributionRule', 'TakeSelf', 'StoreInfo', function($scope, $rootScope, $stateParams, $modal, $state, Bill, toaster, Order, $filter, ShippingAddress, Ysepay, $q, NumberService, Cart, $timeout, DistributionRule, TakeSelf, StoreInfo) {
 
+		document.title = '结算页-优软商城';
 		$rootScope.active = 'buyer_cart';
 
 		$scope.payment = {};
@@ -332,7 +333,7 @@ define(['app/app'], function(app) {
 			$scope.calculateTotal();
 			updateStoreArray(detail);
 			$q.all([updateFare($scope.ruleMap[detail.storeid], $scope.storePrice[detail.storeName]).$promise]).then(function (data) {
-				if (data){
+				if (data && data.length > 0 && data[0]){
 					var id = $scope.deliveryList[detail.storeid].id;
 					var arr = data[0];
 					$scope.ruleMap[detail.storeid] = arr;
@@ -343,6 +344,8 @@ define(['app/app'], function(app) {
 						}
 					});
 					$scope.calculateFare();
+				}else {
+					$scope.calculateFare();
 				}
 			});
 		};
@@ -362,7 +365,7 @@ define(['app/app'], function(app) {
 			$scope.calculateTotal();
 			updateStoreArray(detail);
 			$q.all([updateFare($scope.ruleMap[detail.storeid], $scope.storePrice[detail.storeName]).$promise]).then(function (data) {
-				if (data){
+				if (data && data.length > 0 && data[0]){
 					var id = $scope.deliveryList[detail.storeid].id;
 					var arr = data[0];
 					$scope.ruleMap[detail.storeid] = arr;
@@ -373,6 +376,8 @@ define(['app/app'], function(app) {
 						}
 					});
 					$scope.calculateFare();
+				}else {
+					$scope.calculateFare();
 				}
 			});
 
@@ -396,6 +401,10 @@ define(['app/app'], function(app) {
 		 * @returns {*|{url, method, isArray}}
 		 */
 		var updateFare = function (ruleList, price) {
+			if(ruleList == null || ruleList.length < 1) {
+				// toaster.pop('warning', '提示', "配送规则缺失,请联系卖家设置相应的配送规则");
+				return 0;
+			}
 			return DistributionRule.findFareOfRule({price:price}, ruleList, function (data) {
 				if (data){
 
@@ -435,7 +444,7 @@ define(['app/app'], function(app) {
 			$scope.calculateTotal();
 			updateStoreArray(detail);
 			$q.all([updateFare($scope.ruleMap[detail.storeid], $scope.storePrice[detail.storeName]).$promise]).then(function (data) {
-				if (data){
+				if (data && data.length > 0 && data[0]){
 					var id = $scope.deliveryList[detail.storeid].id;
 					var arr = data[0];
 					$scope.ruleMap[detail.storeid] = arr;
@@ -446,6 +455,8 @@ define(['app/app'], function(app) {
 						}
 					});
 					$scope.calculateFare();
+				}else {
+					$scope.calculateFare();
 				}
 			});
 		};
@@ -588,7 +599,12 @@ define(['app/app'], function(app) {
 						if ($scope.order.currency == 'RMB' && $scope.order.paytype == '1102') {
 							paymentEnsure(arr);
 						} else if($scope.order.paytype == '1103') {
-							$state.go('order_transfer', {orderid : enIdFilter(arr.join('-'))});
+							console.log(arr.length)
+							if(arr.length != 1){
+								$state.go('downPayment', {orderid : enIdFilter(arr.join('-'))});
+							}else {
+								$state.go('order_transfer', {orderid : enIdFilter(arr.join('-'))});
+							}
 						}else {
 							toaster.pop('info', '美元请线下付款');
 							$state.go('buyer_order');

+ 503 - 103
src/main/webapp/resources/js/usercenter/controllers/forstore/pay_center_ctrl.js

@@ -3,40 +3,22 @@
  */
 define(['app/app'], function(app) {
 	'use strict';
-	app.register.controller('payCenterCtrl', ['$scope', '$rootScope', 'ngTableParams', 'Ysepay', 'BaseService', 'bankInfoService', '$filter', '$modal', 'toaster', 'OrderSimpleInfo', 'SessionService', function($scope, $rootScope, ngTableParams, Ysepay, BaseService, bankInfoService, $filter, $modal, toaster, OrderSimpleInfo, SessionService) {
+	app.register.controller('payCenterCtrl', ['$scope', '$rootScope', 'ngTableParams', 'BaseService', 'bankInfoService', '$filter', 'SessionService', '$modal', 'toaster', 'OrderSimpleInfo', 'Loading', function($scope, $rootScope, ngTableParams, BaseService, bankInfoService, $filter, SessionService, $modal, toaster, OrderSimpleInfo, Loading) {
 		$rootScope.active = 'pay_center';
 
+		document.title = '支付中心-优软商城';
 		var hideBankFilter = $filter("hideBankFilter");
 
+		//历史记录的状态
+		var hiStatus= SessionService.get("buyCenter");
 
-		//银行账户信息,历史记录的的的状态
-		var hiStatus= SessionService.get('paycenter');
+		$scope.status = hiStatus == null ? 'pay-history' : hiStatus;
 
-		$scope.status = hiStatus == null ? 'pay-info' : hiStatus;
-
-		//企业和个人的账户状态
-		var accStatus= SessionService.get('accountstatus');
-		if ($rootScope.userInfo.enterprises) {
-			$scope.accountStatus = accStatus == null ? 'personal' : accStatus;
-		} else {
-			$scope.accountStatus = 'personal';
-		}
-
-
-		//切换银行账户信息,历史记录的的的状态
+		//切换银行账户信息,历史记录的状态
 		$scope.toggleStatus = function(status) {
 			if($scope.status != status) {
 				$scope.status = status;
-				SessionService.set('paycenter', status);
-				loadData();
-			}
-		};
-
-		//切换企业和个人的账户状态
-		$scope.toggleAccountStatus = function (status) {
-			if($scope.accountStatus != status) {
-				$scope.accountStatus = status;
-				SessionService.set('accountstatus', status);
+				SessionService.set('buyCenter', status);
 				loadData();
 			}
 		};
@@ -50,16 +32,22 @@ define(['app/app'], function(app) {
 		 */
 		$scope.tradeRecordPage = {};
 
+		$scope.$$record = {};
+
 		$scope.AllOrderInfo = {};
 
 		$scope.param = {};
 
+		$scope.currency = 'ALL';
+
+		$scope.paytype = 'ALL';
+
 		/**
 		 * 使用ngTable 获取支付记录信息
 		 */
 		$scope.tradeRecordTableParams = new ngTableParams({
 			page : 1,
-			count : 10,
+			count : 30,
 			sorting : {
 				paytime : 'DESC'
 			}
@@ -67,43 +55,198 @@ define(['app/app'], function(app) {
 			total : 0,
 			getData : function ($defer, params) {
 				const param = BaseService.parseParams(params.url());
-				//目前直接从订单中获取信息
+				if ($scope.keyword && $scope.keyword.length > 0){
+					param.keyword = $scope.keyword;
+				}
+				if ($scope.currency && $scope.currency != 'ALL'){
+					param.currencyName = $scope.currency;
+				}
+				if ($scope.paytype && $scope.paytype != 'ALL'){
+					param.method = $scope.paytype;
+				}
+				if ($scope.startDate){
+					param.fromDate = $scope.startDate.getTime();
+				}
+				if ($scope.endDate){
+					param.toDate = $scope.endDate.getTime();
+				}
+				//目前直接从订单中获取信息 --支付记录
 				OrderSimpleInfo.getBuyPayRecord(param, function (page) {
-					$scope.tradeRecordPage = page.data;
-					$scope.AllOrderInfo.totalPages = $scope.tradeRecordPage.totalPages;
-					$scope.param.page = $scope.tradeRecordPage.number;
-					$scope.acculatePages($scope.tradeRecordPage.number, $scope.tradeRecordPage.totalPages);
+					$scope.tradeRecordPage = page.content;
+					$scope.AllOrderInfo.totalPages = page.totalPages;
+					$scope.param.page = page.number;
+
+
+					$scope.$$record.totalElements = page.totalElements;
+					if(Number(page.totalElements) > 0) {
+						$scope.$$record.start = Number(page.size) * (Number(page.number) - 1) + 1;
+					}else {
+						$scope.$$record.start = 0;
+					}
+					$scope.$$record.end = Number(page.size) * (Number(page.number) - 1) + Number(page.numberOfElements);
+					$scope.acculatePages(page.number, $scope.AllOrderInfo.totalPages);
 				}, function (response) {
+
 				});
-				// Ysepay.findTradeRecordChartOfUser(param, {}, function (page) {
-				// 	$scope.tradeRecordPage = page;
-				// 	if (!page.content) {
-				// 		$scope.tradeRecordPage.content = [];
-				// 	}
-					// angular.forEach($scope.tradeRecordPage.content, function (tradeRecord) {
-					// 	if (tradeRecord.state == '已付款') {
-					// 		tradeRecord.amount = tradeRecord.totalAmount;
-					// 		tradeRecord.recordStatus = '支付成功';
-					// 	} else if (tradeRecord.state == '已退款') {
-					// 		tradeRecord.amount = tradeRecord.refundAmount;
-					// 		tradeRecord.recordStatus = '退款成功';
-					// 	}
-					// 	console.log(tradeRecord);
-					// });
-					// console.log(page);
-				// }, function (resp) {
-				// 	console.log(resp);
-				// });
 			}
 		});
 
+		$scope.$$bankInfo = {};
+		$scope.bankInfoTableParams = new ngTableParams({
+			page : 1,
+			count : 10,
+			sorting : {
+				num : 'ASC'
+			}
+		},{
+			total : 0,
+			getData : function ($defer, params) {
+				var param = BaseService.parseParams(params.url());
+				bankInfoService.getBuyPersonalBank(param, {}, function(page) {
+					$scope.accounts = page.content;
+
+					$scope.$$bankInfo.totalElements = page.totalElements;
+					if(Number(page.totalElements) > 0) {
+						$scope.$$bankInfo.start = Number(page.size) * (Number(page.number) - 1) + 1;
+					}else {
+						$scope.$$bankInfo.start = 0;
+					}
+					$scope.$$bankInfo.end = Number(page.size) * (Number(page.number) - 1) + Number(page.numberOfElements);
+
+					params.total(page.totalElements);
+					$defer.resolve(page.content);
+				}, function() {
+					toaster.pop('error', '获取账户信息失败');
+				});
+			}
+		});
+
+		$scope.condition = [];
+		var start = {
+			open : false
+		};
+		var end = {
+			open : false
+		};
+		$scope.condition.push(start);
+		$scope.condition.push(end);
+
+		// 打开日期选择框
+		$scope.openDatePicker = function($event, item, openParam, status) {
+			// if (status != null) {
+			// 	if (status == 1) {
+			// 		if ($scope.startDate != null) {
+			// 			return;
+			// 		}
+			// 	}
+			// 	if (status == 2) {
+			// 		if ($scope.endDate != null) {
+			// 			return;
+			// 		}
+			// 	}
+			// }
+			$event.preventDefault();
+			$event.stopPropagation();
+			openParam == 0 ? $scope.condition[1].open = false : $scope.condition[0].open = false;
+			item[openParam].open = !item[openParam].open;
+		};
+
+		$scope.onDateCondition = function (bool) {
+			// var text = '';
+			// var datePattern = /^(\d{4})-(\d{2})-(\d{2})$/;
+			if (bool == 1){
+				// text = document.getElementById("start").value;
+				// if (text != '' && !datePattern.test(text)){
+				// 	toaster.pop("info", "请输入正确开始时间格式");
+				// 	return;
+				// }
+				// if (text != '' && !validateDate(text)){
+				// 	toaster.pop("info", "请输入正确开始时间格式");
+				// 	return;
+				// }
+				// if (!$scope.startDate && text != ''){
+				// 	$scope.startDate = convertTextToDate(text);
+				// }
+				if ($scope.startDate && !$scope.endDate){
+					var nowTime = new Date();
+					$scope.endDate = new Date(nowTime.getFullYear(), nowTime.getMonth(), nowTime.getDate());
+				}
+				if ($scope.startDate && $scope.endDate){
+					if ($scope.startDate.getTime() > $scope.endDate.getTime()){
+						$scope.endDate = new Date($scope.startDate.getTime() + 86400000);
+					}
+				}
+			}else {
+				// text = document.getElementById("end").value;
+				// if (text != '' && !datePattern.test(text)){
+				// 	// $scope.endDate = text;
+				// 	toaster.pop("info", "请输入正确结束时间格式");
+				// 	return;
+				// }
+				// if (text != '' && !validateDate(text)){
+				// 	// $scope.endDate = text;
+				// 	toaster.pop("info", "请输入正确结束时间格式");
+				// 	return;
+				// }
+				// if (!$scope.endDate && text != ''){
+				// 	$scope.endDate = convertTextToDate(text);
+				// }
+				if ($scope.startDate && $scope.endDate){
+					if ($scope.startDate.getTime() > $scope.endDate.getTime()){
+						$scope.startDate = new Date($scope.endDate.getTime() - 86400000);
+					}
+				}
+			}
+		};
+
+		/**
+		 * 将文本转化为日期
+		 * @param value
+		 * @returns {Date}
+		 */
+		var convertTextToDate = function (value) {
+			var date = value;
+			var result = date.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/);
+
+			return new Date(result[1], result[3] - 1, result[4]);
+		};
+
+		/**
+		 * 验证日期格式是否正确
+		 * @param value
+		 * @returns {boolean}
+		 */
+		var validateDate = function (value) {
+			var date = value;
+			var result = date.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/);
+
+			if (result == null)
+				return false;
+			var d = new Date(result[1], result[3] - 1, result[4]);
+			return (d.getFullYear() == result[1] && (d.getMonth() + 1) == result[3] && d.getDate() == result[4]);
+		};
+
 		var loadAccountData = function() {
-			bankInfoService[$scope.getAccountData].call(null,{}, function(data) {
-				$scope.accounts = data;
-			}, function(response) {
-				toaster.pop('error', '获取账户信息失败');
-			});
-		}
+			$scope.bankInfoTableParams.page(1);
+			$scope.bankInfoTableParams.reload();
+		};
+
+		var clearHistoryParams = function () {
+			$scope.keyword = null;
+			$scope.currency = 'ALL';
+			$scope.paytype = 'ALL';
+			$scope.startDate = null;
+			$scope.endDate = null;
+		};
+
+		$scope.filterLoad = function () {
+			loadPayHistory();
+		};
+
+		var loadPayHistory = function () {
+			$scope.tradeRecordTableParams.page(1);
+			$scope.tradeRecordTableParams.reload();
+		};
 
 		$scope.setDefaultAccount = function(id) {
 			bankInfoService.setDefaultAccount({id : id}, function() {
@@ -112,20 +255,31 @@ define(['app/app'], function(app) {
 			}, function(response) {
 				toaster.pop('error', '设置默认账户失败');
 			})
-		}
+		};
+
+		$scope.showDeleteFrame = function (item) {
+			$scope.showDelete = true;
+			$scope.deleteObject = item;
+		};
 
+		$scope.cancelDelete = function () {
+			$scope.showDelete = false;
+			$scope.deleteObject = null;
+		};
 		//删除账户
-		$scope.deleteAccount = function(buyAccount) {
-			var  isSure = confirm('确认删除本银行账户?删除后无法恢复,请谨慎操作');
-			if(isSure){
-				bankInfoService.deleteBank({id: buyAccount.id}, function(data) {
-					toaster.pop('success', '删除成功');
-					loadAccountData();
-				}, function(response) {
+		$scope.deleteAccount = function() {
+			if ($scope.deleteObject){
+				bankInfoService.deleteBank({id: $scope.deleteObject.id}, function(data) {
+					if (data){
+						toaster.pop('success', '删除成功');
+						$scope.showDelete = false;
+						loadAccountData();
+					}
+				}, function() {
 					toaster.pop('error', '删除失败');
 				})
 			}
-		}
+		};
 
 		//编辑账户
 		$scope.editAccount = function(data) {
@@ -133,10 +287,6 @@ define(['app/app'], function(app) {
 				templateUrl : 'static/view/common/bankInfoModal.html',
 				controller : 'BankInfoCtrl',
 				resolve : {
-					kind : function() {
-						//深拷贝一份
-						return angular.copy($scope.accountStatus == 'personal' ? true: false);
-					},
 					account : function() {
 						//深拷贝一份
 						return angular.copy(data);
@@ -148,11 +298,6 @@ define(['app/app'], function(app) {
 				if(data) {
 					$scope.accounts.splice(data.num - 1, 1, account);
 				}else {//如果是新增。
-					if(account.kind == 1) {
-						$scope.accountStatus='personal';
-					}else if(account.kind == 2) {
-						$scope.accountStatus='enterprise';
-					}
 					loadAccountData();
 				}
 
@@ -165,25 +310,103 @@ define(['app/app'], function(app) {
 		var loadData = function() {
 			switch ($scope.status) {
 				case 'pay-info' :
-					switch ($scope.accountStatus) {
-						case 'personal' :
-							$scope.getAccountData = 'getBuyPersonalBank';
-							break;
-						case 'enterprise' :
-							$scope.getAccountData = 'getBuyEnterpriseBank';
-							break;
-					}
-					loadAccountData();
+					clearHistoryParams();
+					// loadAccountData();
 					break;
 				case 'pay-history':
-					$scope.tradeRecordTableParams.page(1);
-					$scope.tradeRecordTableParams.reload();
+					loadPayHistory();
 					break;
 			}
 		};
-
 		loadData();
 
+		$scope.search = function () {
+			if (!$scope.startDate && $scope.endDate){
+				toaster.pop("info", "请输入起始日期");
+				return ;
+			}
+			if ($scope.startDate && !$scope.endDate){
+				toaster.pop("info", "请输入结束日期");
+				return ;
+			}
+			loadPayHistory();
+		};
+
+		$scope.exportToExcel = function () {
+			if ($scope.$$record.totalElements == 0) {
+				toaster.pop('info', '当前支付记录为空,无法导出');
+				return ;
+			}
+			exportByAjax();
+		};
+
+		var exportByAjax = function () {
+			var url = 'trade/order/export/payRecord';
+			var strArray = [];
+			if ($scope.keyword && $scope.keyword.length > 0){
+				var wordStr = "keyword=" + $scope.keyword;
+				strArray.push(wordStr);
+			}
+			if ($scope.currency && $scope.currency != 'ALL'){
+				var currencyStr = "currencyName=" + $scope.currency;
+				strArray.push(currencyStr);
+			}
+			if ($scope.paytype && $scope.paytype != 'ALL'){
+				var typeStr = "method=" + $scope.paytype;
+				strArray.push(typeStr);
+			}
+			if ($scope.startDate){
+				var startStr = "fromDate=" + $scope.startDate.getTime();
+				strArray.push(startStr);
+			}
+			if ($scope.endDate){
+				var endStr = "toDate=" + $scope.endDate.getTime();
+				strArray.push(endStr);
+			}
+			if (strArray.length != 0){
+				var str = strArray.join("&");
+				url = url + "?" + str;
+			}
+			var form = $("<form>");   //定义一个form表单
+			form.attr('style', 'display:none');   //在form表单中添加查询参数
+			form.attr('target', '');
+			form.attr('method', 'POST');
+			form.attr('action', url);
+
+			$('body').append(form);  //将表单放置在web中
+			form.submit();
+
+			$scope.$$record.clockID = setInterval(function() {
+				getDownLoadStatus();
+			}, 500);
+		};
+
+		var getDownLoadStatus = function () {
+			Loading.show();
+			$.ajax({
+				url : 'trade/order/export/payRecord',
+				data : {isAjax : true},
+				method : 'POST',
+				dataType : 'json',
+				success : function (data) {
+					if(!data.loading){
+						$scope.$apply(function () {
+							toaster.pop('info', '数据处理完毕,正在下载文件,请稍等。');
+							Loading.hide();
+						});
+						if($scope.$$record.clockID) {
+							clearInterval($scope.$$record.clockID);
+						}
+					}
+				},
+				error : function () {
+					Loading.hide();
+					if($scope.$$record.clockID) {
+						clearInterval($scope.$$record.clockID);
+					}
+				}
+			});
+		};
 
 		/******************根据页数设置翻页的信息********start**************************/
 
@@ -363,19 +586,105 @@ define(['app/app'], function(app) {
 				$scope.middleSegment(currentPage);
 			}
 		};
-		/******************根据页数设置翻页的信息********end**************************/
+
+		$rootScope.$on('$stateChangeStart',function(event,toState,toParams,fromState,fromParams){
+			if(fromState.name == 'pay_center' || toState.name == 'pay_center'){
+				SessionService.unset("buyCenter");
+			}
+		});
 	}]);
 
 
 
-	app.register.controller('BankInfoCtrl', ['$scope', '$modalInstance', 'account', 'kind', 'bankInfoService', 'toaster', function($scope, $modalInstance, account, kind, bankInfoService, toaster){
+	app.register.controller('BankInfoCtrl', ['$scope', '$modalInstance', 'account', 'bankInfoService', 'toaster', function($scope, $modalInstance, account, bankInfoService, toaster){
+
+		/**
+		 * 目前只支持的银行
+		 * @type {string[]}
+		 */
+		$scope.bankList = [
+			'中国银行','中国建设银行','中国工商银行','中国农业银行','交通银行','招商银行','中国民生银行',
+			'兴业银行','中信银行','中国光大银行','广发银行','平安银行','中国邮政储蓄银行','华夏银行','浦发银行'
+		];
+
+		var initIndex = function () {
+			$scope.selectIndex = -1;
+			$scope.downIndex = 0;
+		};
+
+		$scope.getItemFocus = function() {
+			$scope.showBankFrame = true;
+			$scope.matchData = true;
+			$scope.resultList = $scope.bankList;
+			initIndex();
+		};
+
+		$scope.onItemBlur = function () {
+			if ($scope.time){
+				clearTimeout($scope.time);
+			}
+			$scope.time = setTimeout(function () {
+				$scope.$apply(function () {
+					$scope.showBankFrame = false;
+				});
+			}, 200);
+		};
+		$scope.onKeyUp = function () {
+			var dom = document.getElementById("ulContent");
+			console.log(event);
+			if ($scope.showBankFrame){
+				if(event.keyCode == 40) { //监听到按下键
+					$scope.selectIndex ++;
+					if ($scope.downIndex == 5){
+						dom.scrollTop += 44;
+					}
+					if ($scope.downIndex <= 4){
+						$scope.downIndex++;
+					}
+					if($scope.selectIndex >= $scope.resultList.length){
+						$scope.selectIndex = 0;
+						dom.scrollTop = 0;
+						$scope.downIndex = 1;
+					}
+					$scope.account.bankname = $scope.resultList[$scope.selectIndex];
+					// $scope.containsAttr($scope.logistics.companyName);
+				} else if(event.keyCode == 38) { //监听到按上键
+					$scope.selectIndex --;
+					if ($scope.downIndex == 1){
+						dom.scrollTop -= 44;
+					}
+					if ($scope.downIndex >= 2){
+						$scope.downIndex--;
+					}
+					if($scope.selectIndex < 0){
+						$scope.selectIndex = $scope.resultList.length - 1;
+						dom.scrollTop = 2400;
+						$scope.downIndex = 5;
+					}
+					$scope.account.bankname = $scope.resultList[$scope.selectIndex];
+					// $scope.containsAttr($scope.logistics.companyName);
+				} else if(event.keyCode == 13) { //确定键
+					$scope.showBankFrame = false;
+				}
+			}
+		};
+
+		$scope.showList = function () {
+			$scope.showBankFrame = !$scope.showBankFrame;
+			$scope.matchData = true;
+			$scope.resultList = $scope.bankList;
+		};
+
+		$scope.inputBankName = function () {
+			$scope.showBankFrame = true;
+		};
+
+		$scope.fitBankToAccount = function (item) {
+			$scope.account.bankname = item;
+			$scope.showBankFrame = false;
+		};
+
 		$scope.account = account;
-		if($scope.account) {
-			$scope.eidt = true;
-		} else {
-			delete $scope.eidt;
-		}
-		$scope.kind = kind;
 		if($scope.account) {
 			$scope.title = "修改账户";
 		}else {
@@ -383,24 +692,115 @@ define(['app/app'], function(app) {
 			$scope.account = {};
 		}
 
-		$scope.set = function(kind) {
-			$scope.kind = kind;
-		}
+		var matchArray = function () {
+			$scope.account.bankname = $scope.account.bankname ? $scope.account.bankname : '';
+			$scope.resultList = $scope.bankList.filter(function (data) {
+				if (data.indexOf($scope.account.bankname) >= 0){
+					return data;
+				}
+			});
+			if ($scope.resultList.length > 0){
+				$scope.matchData = true;
+			}else{
+				$scope.matchData = false;
+			}
+		};
+
+		/**
+		 * 验证新增账户格式
+		 * @param num
+		 */
+		$scope.checkAccount = function (num) {
+			var size;
+			if (num == 1){
+				//验证开户银行名称
+				$scope.showBankFrame = true;
+				matchArray();
+			}else if(num == 2){
+				//验证开户支行名称
+				if($scope.account.branchname){
+					size = $scope.account.branchname.replace(/[^\x00-\xff]/g,'**').length;
+					if (size > 40){
+						$scope.branchError = true;
+					}else {
+						$scope.branchError = false;
+					}
+					var telPatt = new RegExp("^[\u2E80-\u9FFF]+$");
+					if (telPatt.test($scope.account.branchname)){
+						$scope.branchPattError = false;
+					}else {
+						$scope.branchPattError = true;
+					}
+				}
+			}else if(num == 3){
+				//验证银行账号
+				if ($scope.account.number){
+					size = $scope.account.number.replace(/[^\x00-\xff]/g,'**').length;
+					if (size > 30){
+						$scope.numberError = true;
+					}else {
+						$scope.numberError = false;
+					}
+					var numPatt = new RegExp("^[0-9]+$");
+					if (numPatt.test($scope.account.number)){
+						$scope.numberPattError = false;
+					}else {
+						$scope.numberPattError = true;
+					}
+					validateRepeat($scope.account.number);
+				}
+			}else if(num == 4){
+				//验证开户名称
+				if ($scope.account.accountname){
+					size = $scope.account.accountname.replace(/[^\x00-\xff]/g,'**').length;
+					if (size > 100){
+						$scope.nameError = true;
+					}else {
+						$scope.nameError = false;
+					}
+				}
+			}
+		};
+
+		var validateRepeat = function (number) {
+			bankInfoService.getCountByNumber({type:1061, number:number}, {}, function (data) {
+				if (data.success){
+					if (data.data != 0){
+						$scope.repeatError = true;
+					}else {
+						$scope.repeatError = false;
+					}
+				}else {
+					toaster.pop("info", data.message);
+				}
+			});
+		};
 
 		$scope.confirm = function() {
-			var method = '';
-			if($scope.kind) {
-				method = 'saveBuyPersonalBank';
-			}else {
-				method = 'saveBuyEnterpriseBank';
+			var account = $scope.account;
+
+			if (!account){
+				toaster.pop('error', '请按要求填写正确的信息');
+				return ;
+			}
+			if (!account.bankname || !account.branchname || !account.number || !account.accountname){
+				toaster.pop('error', '请按要求填写正确的信息');
+				return ;
 			}
+			if (!$scope.matchData || $scope.branchError || $scope.branchPattError || $scope.numberError || $scope.numberPattError ||
+				$scope.nameError || $scope.repeatError){
+				toaster.pop('error', '请按要求填写正确的信息');
+				return ;
+			}
+
+			var method = 'saveBuyPersonalBank'; //不区分个人和企业账户
 			bankInfoService[method].call(null, null, $scope.account, function(data) {
 				toaster.pop('success', '保存成功');
 				$modalInstance.close(data)
 			},function (response) {
 				toaster.pop('warning', '保存信息失败');
 			});
-		}
+		};
 
 		$scope.cancel = function() {
 			$modalInstance.dismiss();

+ 1 - 1
src/main/webapp/resources/js/usercenter/controllers/forstore/query_logistics_ctrl.js

@@ -4,7 +4,7 @@ define(['app/app', 'calendar'], function(app) {
     app.register.controller('buyerQueryLogisticsCtrl', ['$scope', '$rootScope', 'BaseService', 'KdnLogistics', '$stateParams', '$filter', 'Logistics', "Order", 'toaster', function($scope, $rootScope, BaseService, KdnLogistics, $stateParams, $filter, Logistics, Order, toaster) {
 
         $rootScope.active = 'buyer_order';
-
+        document.title = '物流详情-优软商城';
         // 加密过滤器
         var enIdFilter = $filter('EncryptionFilter');
 

+ 1 - 0
src/main/webapp/resources/js/usercenter/controllers/forstore/show_rate_ctrl.js

@@ -7,6 +7,7 @@ define(['app/app'], function (app) {
         $scope.setContFalse = function () {
             $scope.cont = false;
         };
+        document.title = '查看评价-优软商城';
         $scope.vendorRate = {};
         if ($stateParams.orderid && $stateParams.orderid != '') {
             $scope.orderid = $stateParams.orderid;

Неке датотеке нису приказане због велике количине промена