Browse Source

培训系统

wuwen 5 years ago
parent
commit
4733910e61

+ 96 - 12
src/main/java/com/ssj/api/controller/ApiTrainController.java

@@ -83,25 +83,33 @@ public class ApiTrainController extends BaseController {
 		RoleTypeModel roleTypeModel1=new RoleTypeModel();
 		roleTypeModel1.setRoleType(1);
 		roleTypeModel1.setRoleName(defaultRoleTypeNames.get(0));
-		roleTypeModel1.setModules(new String[] {"现场管理","作业标注","学科怀疑"});
+		roleTypeModel1.setUnlock(0);
+		roleTypeModel1.setUnlockAll(0);
+		roleTypeModel1.setModules(new String[] {"主要功能","其它功能"});
 		defaultRoleTypeModels.add(roleTypeModel1);
 		
 		RoleTypeModel roleTypeModel2=new RoleTypeModel();
 		roleTypeModel2.setRoleType(2);
 		roleTypeModel2.setRoleName(defaultRoleTypeNames.get(1));
-		roleTypeModel2.setModules(new String[] {"主要功能","其它功能"});
+		roleTypeModel2.setUnlock(0);
+		roleTypeModel1.setUnlockAll(0);
+		roleTypeModel2.setModules(new String[] {"现场管理","作业标注","学科答疑"});
 		defaultRoleTypeModels.add(roleTypeModel2);
 		
 		
 		RoleTypeModel roleTypeModel3=new RoleTypeModel();
 		roleTypeModel3.setRoleType(3);
 		roleTypeModel3.setRoleName(defaultRoleTypeNames.get(2));
+		roleTypeModel3.setUnlock(0);
+		roleTypeModel1.setUnlockAll(0);
 		roleTypeModel3.setModules(new String[] {});
 		defaultRoleTypeModels.add(roleTypeModel3);
 		
 		RoleTypeModel roleTypeModel4=new RoleTypeModel();
 		roleTypeModel4.setRoleType(4);
 		roleTypeModel4.setRoleName(defaultRoleTypeNames.get(3));
+		roleTypeModel4.setUnlock(0);
+		roleTypeModel1.setUnlockAll(0);
 		roleTypeModel4.setModules(new String[] {});
 		defaultRoleTypeModels.add(roleTypeModel4);
 		
@@ -165,7 +173,7 @@ public class ApiTrainController extends BaseController {
             data.put("name", StringUtils.isNotEmpty(tbLibManager.getName())? tbLibManager.getName(): "");
             data.put("photo", StringUtils.isNotEmpty(user.getPhoto())? user.getPhoto(): "");
             data.put("accessToken", getAccessToken(user.getId(),CodecUtil.createUUID()));
-            data.put("roleTypes", defaultRoleTypeModels);
+            //data.put("roleTypes", defaultRoleTypeModels);
             responseEntity.success(data, "账号密码登录成功");
         } catch (Exception e) {
             logger.error("账号密码登录接口", e);
@@ -176,6 +184,62 @@ public class ApiTrainController extends BaseController {
 	
 	
 	
+	@RequestMapping(value = "/auths")
+    @ApiOperation(value = "学习中心-学习内容列表",   notes = "学习中心-学习内容列表")
+    public ResponseEntity auths(@RequestParam(name = "accessToken") String accessToken) {
+        ResponseEntity responseEntity = new ResponseEntity();
+        Map<String, Object> data=new HashMap<String, Object>();
+        try {
+            String userId = tokenManager.getUserId(accessToken);
+            TbLibManager tbLibManager = getTbLibManagerUserId(userId);
+            if(tbLibManager==null) {
+            	responseEntity.failure("账号无身份权限");
+                return responseEntity;
+            }
+            List<Map<String,Object>> list=videoUserService.findTrainVideoUserByUserId(userId);
+            //是校长
+            if(tbLibManager.getType()==6) {
+            	defaultRoleTypeModels.get(0).setUnlock(1);
+            	
+            	Map<String, Object> dataMap1=getTrainVideoUserMap(1, list);
+            	if(dataMap1!=null && Integer.parseInt(dataMap1.get("success_num").toString())>=Integer.parseInt(dataMap1.get("count_num").toString())) {
+            		defaultRoleTypeModels.get(1).setUnlock(1);
+            		defaultRoleTypeModels.get(1).setUnlockAll(1);
+            	}
+            }else {
+            	defaultRoleTypeModels.get(0).setUnlock(0);
+            	defaultRoleTypeModels.get(0).setUnlockAll(0);
+            	
+            	defaultRoleTypeModels.get(1).setUnlock(1);
+            }
+            
+            Map<String, Object> dataMap2=getTrainVideoUserMap(2, list);
+        	if(dataMap2!=null && Integer.parseInt(dataMap2.get("success_num").toString())>=Integer.parseInt(dataMap2.get("count_num").toString())) {
+        		defaultRoleTypeModels.get(2).setUnlock(1);
+        		defaultRoleTypeModels.get(1).setUnlockAll(1);
+        	}
+           
+        	Map<String, Object> dataMap3=getTrainVideoUserMap(3, list);
+         	if(dataMap3!=null && Integer.parseInt(dataMap3.get("success_num").toString())>=Integer.parseInt(dataMap3.get("count_num").toString())) {
+         		defaultRoleTypeModels.get(3).setUnlock(1);
+         		defaultRoleTypeModels.get(2).setUnlockAll(1);
+         	}
+         	
+         	Map<String, Object> dataMap4=getTrainVideoUserMap(4, list);
+         	if(dataMap4!=null && Integer.parseInt(dataMap4.get("success_num").toString())>=Integer.parseInt(dataMap4.get("count_num").toString())) {
+         		defaultRoleTypeModels.get(3).setUnlockAll(1);
+         	}
+
+            data.put("roleTypes", defaultRoleTypeModels);
+            responseEntity.success(data, "查询成功");
+        } catch (Exception e) {
+            logger.error("学习中心-选择身份接口", e);
+            responseEntity.failure(ResponseConstant.CODE_500, "系统繁忙,请稍后重试");
+        }
+        return responseEntity;
+    }
+	
+	
 	@RequestMapping(value = "/home")
     @ApiOperation(value = "学习中心-选择身份接口",   notes = "学习中心-选择身份接口")
     public ResponseEntity home(@RequestParam(name = "accessToken") String accessToken) {
@@ -202,7 +266,7 @@ public class ApiTrainController extends BaseController {
             }else {
             	map1.put("successNum", 0);
             	map1.put("countNum", 0);
-            	map1.put("unlock", 1);
+            	map1.put("unlock", 0);
             }
             data.add(map1);
             
@@ -212,7 +276,7 @@ public class ApiTrainController extends BaseController {
             map2.put("roleName", defaultRoleTypeNames.get(1));
             map2.put("successNum", dataMap2!=null ? Integer.parseInt(dataMap2.get("success_num").toString()):0);
             map2.put("countNum", dataMap2!=null ? Integer.parseInt(dataMap2.get("count_num").toString()):0);
-            map2.put("unlock", (int)map2.get("successNum")>=(int)map2.get("countNum")?1:0);
+            map2.put("unlock", (int)map1.get("successNum")>=(int)map1.get("countNum")?1:0);
             data.add(map2);
             
             Map<String, Object> map3=new HashMap<String, Object>();
@@ -221,7 +285,7 @@ public class ApiTrainController extends BaseController {
             map3.put("roleName", defaultRoleTypeNames.get(2));
             map3.put("successNum", dataMap3!=null ? Integer.parseInt(dataMap3.get("success_num").toString()):0);
             map3.put("countNum", dataMap3!=null ? Integer.parseInt(dataMap3.get("count_num").toString()):0);
-            map3.put("unlock", (int)map3.get("successNum")>=(int)map3.get("countNum")?1:0);
+            map3.put("unlock", (int)map2.get("successNum")>=(int)map2.get("countNum")?1:0);
             data.add(map3);
             
             Map<String, Object> map4=new HashMap<String, Object>();
@@ -230,7 +294,7 @@ public class ApiTrainController extends BaseController {
             map4.put("roleName", defaultRoleTypeNames.get(3));
             map4.put("successNum", dataMap4!=null ? Integer.parseInt(dataMap4.get("success_num").toString()):0);
             map4.put("countNum", dataMap4!=null ? Integer.parseInt(dataMap4.get("count_num").toString()):0);
-            map4.put("unlock", (int)map4.get("successNum")>=(int)map4.get("countNum")?1:0);
+            map4.put("unlock", (int)map3.get("successNum")>=(int)map3.get("countNum")?1:0);
             data.add(map4);
             
             responseEntity.success(data, "查询成功");
@@ -251,9 +315,11 @@ public class ApiTrainController extends BaseController {
         List<Map<String, Object>> data=new ArrayList<Map<String,Object>>();
         try {
             String userId = tokenManager.getUserId(accessToken);
+            
             List<Map<String, Object>> list=videoInfoService.findTrainVideoUserByRoleType(userId, requestVO.getRoleType(), requestVO.getModule());
             Map<String, Object> dataMap=null;
             for (Map<String, Object> map : list) {
+            	int index=list.indexOf(map);
             	dataMap=new HashMap<String, Object>();
             	dataMap.put("id", map.get("id"));
             	dataMap.put("roleType", map.get("role_type"));
@@ -262,11 +328,29 @@ public class ApiTrainController extends BaseController {
             	dataMap.put("description", map.get("description"));
             	dataMap.put("url", map.get("url"));
             	dataMap.put("roleName", defaultRoleTypeNames.get(Integer.parseInt(map.get("role_type").toString())-1));
-				if(Integer.parseInt(map.get("un_lock").toString())>0) {
-					dataMap.put("unlock", 1);
-				}else {
-					dataMap.put("unlock", 0);
-				}
+            	
+            	List<VideoUser> videoUsers=videoUserService.findVideoUserByUserIdAndVideoId(map.get("id").toString(), userId);
+            	if(videoUsers!=null && videoUsers.size()>0) {
+            		dataMap.put("status", 1);
+            	}else {
+            		dataMap.put("status", 0);
+            	}
+            	
+            	VideoInfo maxVideoInfo=videoInfoService.getVideoInfoByMax(requestVO.getRoleType(), map.get("id").toString());
+            	if(maxVideoInfo!=null) {
+            		dataMap.put("type", 0);
+            	}else {
+            		dataMap.put("type", 1);
+            	}
+            	if(index<=0) {
+            		dataMap.put("unlock", 1);
+            	}else {
+					if(Integer.parseInt(list.get(index-1).get("un_lock").toString())>0) {
+						dataMap.put("unlock", 1);
+					}else {
+						dataMap.put("unlock", 0);
+					}
+            	}
 				data.add(dataMap);
 			}
             responseEntity.success(data, "查询成功");

+ 20 - 3
src/main/java/com/ssj/api/domain/model/RoleTypeModel.java

@@ -1,14 +1,15 @@
 package com.ssj.api.domain.model;
 
-import java.util.ArrayList;
-import java.util.List;
-
 public class RoleTypeModel {
 	
 	private Integer roleType;
 	
 	private String roleName;
 	
+	private Integer unlock;
+	
+	private Integer unlockAll;
+	
 	private String[] modules;
 
 	public Integer getRoleType() {
@@ -35,6 +36,22 @@ public class RoleTypeModel {
 		this.modules = modules;
 	}
 
+	public Integer getUnlock() {
+		return unlock;
+	}
+
+	public void setUnlock(Integer unlock) {
+		this.unlock = unlock;
+	}
+
+	public Integer getUnlockAll() {
+		return unlockAll;
+	}
+
+	public void setUnlockAll(Integer unlockAll) {
+		this.unlockAll = unlockAll;
+	}
+
 	
 	
 	

+ 10 - 0
src/main/java/com/ssj/bean/sys/fx/domain/Merchant.java

@@ -72,6 +72,8 @@ public class Merchant extends BaseEntity {
 	
 	private Integer libService;
 	
+	private Integer libServiceMonth;
+	
 	private Integer platformService;
 	
 	private Integer signService;
@@ -377,4 +379,12 @@ public class Merchant extends BaseEntity {
 		this.signType = signType;
 	}
 
+	public Integer getLibServiceMonth() {
+		return libServiceMonth;
+	}
+
+	public void setLibServiceMonth(Integer libServiceMonth) {
+		this.libServiceMonth = libServiceMonth;
+	}
+
 }

+ 3 - 0
src/main/java/com/ssj/dao/sys/fx/dao/MerchantDao.java

@@ -43,6 +43,9 @@ public interface MerchantDao extends JpaRepository<Merchant, String> {
 	@Query(nativeQuery = true, value = " SELECT t.* from fx_merchant t LEFT JOIN tb_lib_vip v ON t.lib_id=v.lib_id WHERE v.id IS NOT NULL AND v.id=?1 ORDER BY t.create_time DESC LIMIT 1 ")
 	public Merchant getMerchantByVipId(String vipId);
 	
+	@Query(nativeQuery = true, value = " SELECT * from fx_merchant t where t.sign_type in (1,2,3)  ORDER BY t.create_time ASC ")
+	public List<Merchant> findMerchantSignByAll();
+	
 	@Query(nativeQuery = true, value = " SELECT * from fx_merchant t where t.sign_type in (1,2,3) AND TO_DAYS(t.end_sign_time)<=TO_DAYS(NOW()) ORDER BY t.create_time ASC ")
 	public List<Merchant> findMerchantSignByEndTime();
 	

+ 3 - 0
src/main/java/com/ssj/dao/sys/train/dao/VideoUserDao.java

@@ -14,5 +14,8 @@ public interface VideoUserDao extends JpaRepository<VideoUser, String> {
 
 	@Query(nativeQuery = true,value =  " SELECT * from tr_video_user t WHERE t.`status`=1 AND t.role_type=?1 AND t.user_id=?2  ORDER BY t.create_time asc  ")
 	public List<VideoUser> findVideoUserByUserIdAndRoleType(Integer roleType,String userId);
+	
+	@Query(nativeQuery = true,value =  " SELECT * from tr_video_user t WHERE t.`status`=1 AND t.video_id=?1 AND t.user_id=?2  ORDER BY t.create_time asc  ")
+	public List<VideoUser> findVideoUserByUserIdAndVideoId(String videoId, String userId);
 
 }

+ 7 - 0
src/main/java/com/ssj/dao/weixin/library/dao/ILibJoinConsumeDao.java

@@ -6,6 +6,7 @@ import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 
 import java.util.Date;
+import java.util.List;
 
 @Repository
 public interface ILibJoinConsumeDao extends JpaRepository<TbLibJoinConsume, String> {
@@ -20,5 +21,11 @@ public interface ILibJoinConsumeDao extends JpaRepository<TbLibJoinConsume, Stri
 	@Query(nativeQuery = true, value = " SELECT IFNULL(SUM(t.lib_service),0) as count from tb_lib_join_consume t where t.from_merchant_id in ?1 AND t.type in (2,3) AND TO_DAYS(t.create_time)>=TO_DAYS(?2) AND TO_DAYS(t.create_time)<TO_DAYS(?3) ORDER BY t.create_time ASC ")
 	Integer countMerchantConsumeByConsumeTime(String[] merchantIds,Date startTime,Date endTime);
 	
+	@Query(nativeQuery = true, value = " SELECT IFNULL(COUNT(1),0) from tb_lib_join_consume t WHERE t.from_merchant_id=?1 AND t.type=2 AND t.vip_id is NOT NULL AND TO_DAYS(DATE_SUB(NOW(),INTERVAL 1 DAY))=TO_DAYS(t.create_time) ")
+	Integer findTbLibJoinConsumeByFrontDay(String merchantId);
+	
+	@Query(nativeQuery = true, value = " SELECT IFNULL(COUNT(1),0) from tb_lib_join_consume t WHERE t.from_merchant_id=?1 AND t.type=2 AND t.vip_id is NOT NULL AND TO_DAYS(DATE_SUB(NOW(),INTERVAL 1 DAY))>TO_DAYS(t.create_time) ")
+	Integer findTbLibJoinConsumeByBeforeDays(String merchantId);
+
 	
 }

+ 0 - 366
src/main/java/com/ssj/framework/core/xss/XssAndSqlHttpServletRequestWrapper.java

@@ -1,366 +0,0 @@
-package com.ssj.framework.core.xss;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.servlet.ReadListener;
-import javax.servlet.ServletInputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletRequestWrapper;
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.nio.charset.Charset;
-import java.util.*;
-import java.util.regex.Pattern;
-
-public class XssAndSqlHttpServletRequestWrapper extends HttpServletRequestWrapper {
-
-    protected Logger log = LoggerFactory.getLogger(this.getClass());
-    private static String key = "and|exec|insert|delete|update|master|truncate|char|declare|alert|javascript|webscan|dbappsecurity|confirm|style|onclick|function|onmouseover|window|location";
-    private static Set<String> notAllowedKeyWords = new HashSet<String>(0);
-    static {
-        String keyStr[] = key.split("\\|");
-        for (String str : keyStr) {
-            notAllowedKeyWords.add(str);
-        }
-    }
-    HttpServletRequest orgRequest = null;
-    private Map<String, String[]> parameterMap;
-    private final byte[] body; //用于保存读取body中数据
-
-    public XssAndSqlHttpServletRequestWrapper(HttpServletRequest request) throws IOException{
-        super(request);
-        orgRequest = request;
-        parameterMap = request.getParameterMap();
-    //    body = StreamUtils.copyToByteArray(request.getInputStream());
-        String bodyString = HttpHelper.getBodyString(request);
-        body = bodyString.getBytes(Charset.forName("UTF-8"));
-
-    }
-
-    // 重写几个HttpServletRequestWrapper中的方法
-    /**
-     * 获取所有参数名
-     *
-     * @return 返回所有参数名
-     */
-    @Override
-    public Enumeration<String> getParameterNames() {
-        Vector<String> vector = new Vector<String>(parameterMap.keySet());
-        return vector.elements();
-    }
-
-    /**
-     * 覆盖getParameter方法,将参数名和参数值都做xss & sql过滤。<br/>
-     * 如果需要获得原始的值,则通过super.getParameterValues(name)来获取<br/>
-     * getParameterNames,getParameterValues和getParameterMap也可能需要覆盖
-     */
-    @Override
-    public String getParameter(String name) {
-        String[] results = parameterMap.get(name);
-        if (results == null || results.length <= 0)
-            return null;
-        else {
-            String value = results[0];
-            if (value != null) {
-                value = xssEncode(value);
-            }
-            return value;
-        }
-    }
-
-    /**
-     * 获取指定参数名的所有值的数组,如:checkbox的所有数据 接收数组变量 ,如checkobx类型
-     */
-    @Override
-    public String[] getParameterValues(String name) {
-        String[] results = parameterMap.get(name);
-        if (results == null || results.length <= 0)
-            return null;
-        else {
-            int length = results.length;
-            for (int i = 0; i < length; i++) {
-                results[i] = xssEncode(results[i]);
-            }
-            return results;
-        }
-    }
-
-    /**
-     * 覆盖getHeader方法,将参数名和参数值都做xss & sql过滤。<br/>
-     * 如果需要获得原始的值,则通过super.getHeaders(name)来获取<br/>
-     * getHeaderNames 也可能需要覆盖
-     */
-    @Override
-    public String getHeader(String name) {
-
-        String value = super.getHeader(xssEncode(name));
-        if (value != null) {
-            value = xssEncode(value);
-        }
-        return value;
-    }
-
-    /**
-     * 将容易引起xss & sql漏洞的半角字符直接替换成全角字符
-     *
-     * @param s
-     * @return
-     */
-    private static String xssEncode(String s) {
-    	return s;
-//        if (s == null || s.isEmpty()) {
-//            return s;
-//        } else {
-//            s = stripXSSAndSql(s);
-//        }
-//        StringBuilder sb = new StringBuilder(s.length() + 16);
-//        for (int i = 0; i < s.length(); i++) {
-//            char c = s.charAt(i);
-//            switch (c) {
-//                case '>':
-//                    sb.append(">");// 转义大于号
-//                    break;
-//                case '<':
-//                    sb.append("<");// 转义小于号
-//                    break;
-//                // case '\'':
-//                // sb.append("'");// 转义单引号
-//                // break;
-//                // case '\"':
-//                // sb.append(""");// 转义双引号
-//                // break;
-//                case '&':
-//                    sb.append("&");// 转义&
-//                    break;
-//                case '#':
-//                    sb.append("#");// 转义#
-//                    break;
-//                default:
-//                    sb.append(c);
-//                    break;
-//            }
-//        }
-//        return sb.toString();
-    }
-
-    /**
-     * 获取最原始的request
-     *
-     * @return
-     */
-    public HttpServletRequest getOrgRequest() {
-        return orgRequest;
-    }
-
-    /**
-     * 获取最原始的request的静态方法
-     *
-     * @return
-     */
-    public static HttpServletRequest getOrgRequest(HttpServletRequest req) {
-        if (req instanceof XssAndSqlHttpServletRequestWrapper) {
-            return ((XssAndSqlHttpServletRequestWrapper) req).getOrgRequest();
-        }
-
-        return req;
-    }
-
-    /**
-     *
-     * 防止xss跨脚本攻击(替换,根据实际情况调整)
-     */
-
-    public static String stripXSSAndSql(String value) {
-        if (value != null) {
-            // NOTE: It's highly recommended to use the ESAPI library and
-            // uncomment the following line to
-            // avoid encoded attacks.
-            // value = ESAPI.encoder().canonicalize(value);
-            // Avoid null characters
-            /** value = value.replaceAll("", ""); ***/
-            // Avoid anything between script tags
-            Pattern scriptPattern = Pattern.compile(
-                    "<[\r\n| | ]*script[\r\n| | ]*>(.*?)</[\r\n| | ]*script[\r\n| | ]*>", Pattern.CASE_INSENSITIVE);
-            value = scriptPattern.matcher(value).replaceAll("");
-            // Avoid anything in a
-            // src="http://www.yihaomen.com/article/java/..." type of
-            // e-xpression
-            scriptPattern = Pattern.compile("src[\r\n| | ]*=[\r\n| | ]*[\\\"|\\\'](.*?)[\\\"|\\\']",
-                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
-            value = scriptPattern.matcher(value).replaceAll("");
-            // Remove any lonesome </script> tag
-            scriptPattern = Pattern.compile("</[\r\n| | ]*script[\r\n| | ]*>", Pattern.CASE_INSENSITIVE);
-            value = scriptPattern.matcher(value).replaceAll("");
-            // Remove any lonesome <script ...> tag
-            scriptPattern = Pattern.compile("<[\r\n| | ]*script(.*?)>",
-                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
-            value = scriptPattern.matcher(value).replaceAll("");
-            // Avoid eval(...) expressions
-            scriptPattern = Pattern.compile("eval\\((.*?)\\)",
-                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
-            value = scriptPattern.matcher(value).replaceAll("");
-            // Avoid e-xpression(...) expressions
-            scriptPattern = Pattern.compile("e-xpression\\((.*?)\\)",
-                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
-            value = scriptPattern.matcher(value).replaceAll("");
-            // Avoid javascript:... expressions
-            scriptPattern = Pattern.compile("javascript[\r\n| | ]*:[\r\n| | ]*", Pattern.CASE_INSENSITIVE);
-            value = scriptPattern.matcher(value).replaceAll("");
-            // Avoid vbscript:... expressions
-            scriptPattern = Pattern.compile("vbscript[\r\n| | ]*:[\r\n| | ]*", Pattern.CASE_INSENSITIVE);
-            value = scriptPattern.matcher(value).replaceAll("");
-            // Avoid onload= expressions
-            scriptPattern = Pattern.compile("onload(.*?)=",
-                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
-            value = scriptPattern.matcher(value).replaceAll("");
-        }
-        return value;
-    }
-
-    public boolean checkXSSAndSql(String value) {
-        boolean flag = false;
-        if (value != null) {
-
-            Pattern scriptPattern = Pattern.compile(
-                    "<[\r\n| | ]*script[\r\n| | ]*>(.*?)</[\r\n| | ]*script[\r\n| | ]*>", Pattern.CASE_INSENSITIVE);
-            flag = scriptPattern.matcher(value).find();
-            if (flag) {
-                return flag;
-            }
-
-            scriptPattern = Pattern.compile("src[\r\n| | ]*=[\r\n| | ]*[\\\"|\\\'](.*?)[\\\"|\\\']",
-                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
-            flag = scriptPattern.matcher(value).find();
-            if (flag) {
-                return flag;
-            }
-
-            scriptPattern = Pattern.compile("</[\r\n| | ]*script[\r\n| | ]*>", Pattern.CASE_INSENSITIVE);
-            flag = scriptPattern.matcher(value).find();
-            if (flag) {
-                return flag;
-            }
-
-            scriptPattern = Pattern.compile("<[\r\n| | ]*script(.*?)>",
-                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
-            flag = scriptPattern.matcher(value).find();
-            if (flag) {
-                return flag;
-            }
-            // Avoid eval(...) expressions
-            scriptPattern = Pattern.compile("eval\\((.*?)\\)",
-                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
-            flag = scriptPattern.matcher(value).find();
-            if (flag) {
-                return flag;
-            }
-            // Avoid e-xpression(...) expressions
-            scriptPattern = Pattern.compile("e-xpression\\((.*?)\\)",
-                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
-            flag = scriptPattern.matcher(value).find();
-            if (flag) {
-                return flag;
-            }
-            // Avoid javascript:... expressions
-            scriptPattern = Pattern.compile("javascript[\r\n| | ]*:[\r\n| | ]*", Pattern.CASE_INSENSITIVE);
-            flag = scriptPattern.matcher(value).find();
-            if (flag) {
-                return flag;
-            }
-            // Avoid vbscript:... expressions
-            scriptPattern = Pattern.compile("vbscript[\r\n| | ]*:[\r\n| | ]*", Pattern.CASE_INSENSITIVE);
-            flag = scriptPattern.matcher(value).find();
-            if (flag) {
-                return flag;
-            }
-            // Avoid onload= expressions
-            scriptPattern = Pattern.compile("onload(.*?)=",
-                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
-            flag = scriptPattern.matcher(value).find();
-            if (flag) {
-                return flag;
-            }
-
-            flag=checkSqlKeyWords(value);
-        }
-        return flag;
-    }
-
-
-
-    public boolean checkSqlKeyWords(String value){
-        String paramValue = value;
-        if(StringUtils.isNotEmpty(paramValue)){
-            paramValue = paramValue.toLowerCase();
-        }
-        for (String keyword : notAllowedKeyWords) {
-            if (paramValue.length() >= keyword.length()
-                    && (paramValue.contains(keyword)||paramValue.contains(" "+keyword)||paramValue.contains(keyword+" ")||paramValue.contains(" "+keyword+" "))) {
-                log.error(this.getRequestURI()+ "参数中包含不允许sql的关键词(" + keyword
-                        + ")");
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public final boolean checkParameter() {
-        Map<String, String[]> submitParams = new HashMap(parameterMap);
-        Set<String> submitNames = submitParams.keySet();
-        for (String submitName : submitNames) {
-            Object submitValues = submitParams.get(submitName);
-            if ((submitValues instanceof String)) {
-                if (checkXSSAndSql((String) submitValues)) {
-                    return true;
-                }
-            } else if ((submitValues instanceof String[])) {
-                for (String submitValue : (String[])submitValues){
-                    if (checkXSSAndSql(submitValue)) {
-                        return true;
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public BufferedReader getReader() throws IOException {
-        return new BufferedReader(new InputStreamReader(getInputStream()));
-    }
-
-    @Override
-    public ServletInputStream getInputStream() throws IOException {
-        final ByteArrayInputStream bais = new ByteArrayInputStream(body);
-        return new ServletInputStream() {
-
-            @Override
-            public int read() throws IOException {
-                return bais.read();
-            }
-
-            @Override
-            public boolean isFinished() {
-                // TODO Auto-generated method stub
-                return false;
-            }
-
-            @Override
-            public boolean isReady() {
-                // TODO Auto-generated method stub
-                return false;
-            }
-
-            @Override
-            public void setReadListener(ReadListener arg0) {
-                // TODO Auto-generated method stub
-
-            }
-        };
-    }
-
-}

+ 0 - 84
src/main/java/com/ssj/framework/core/xss/XssFilter.java

@@ -1,84 +0,0 @@
-package com.ssj.framework.core.xss;
-
-import com.alibaba.fastjson.JSON;
-import com.ssj.bean.common.framework.core.domain.Response;
-import org.apache.commons.lang3.StringUtils;
-
-import javax.servlet.*;
-import javax.servlet.annotation.WebFilter;
-import javax.servlet.http.HttpServletRequest;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.PrintWriter;
-
-
-
-
-@WebFilter(filterName = "xssFilter", urlPatterns = { "/*" })
-public class XssFilter implements Filter {
-
-    @Override
-    public void init(FilterConfig filterConfig) {
-        // no init operation
-    }
-
-    @Override
-    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
-                         FilterChain filterChain) throws IOException, ServletException {
-        HttpServletRequest request = (HttpServletRequest) servletRequest;
-        String contentType = ((HttpServletRequest) request).getHeader("Content-Type");
-        if(contentType!=null && contentType.contains("multipart/form-data")) {
-            filterChain.doFilter(request, servletResponse);
-        }else{
-            XssAndSqlHttpServletRequestWrapper xssRequest = new XssAndSqlHttpServletRequestWrapper(
-                    request);
-            String method = ((HttpServletRequest) request).getMethod();
-            String param = "";
-            if ("POST".equalsIgnoreCase(method)) {
-                param = XssFilter.getBodyString(xssRequest.getReader());
-                if (StringUtils.isNotBlank(param)) {
-                    if (xssRequest.checkXSSAndSql(param)) {
-                        servletResponse.setCharacterEncoding("UTF-8");
-                        servletResponse.setContentType("application/json;charset=UTF-8");
-                        PrintWriter out = servletResponse.getWriter();
-                        out.write(JSON.toJSONString(new Response().failure()));
-                        return;
-                    }
-                }
-            }
-            if (xssRequest.checkParameter()) {
-                servletResponse.setCharacterEncoding("UTF-8");
-                servletResponse.setContentType("application/json;charset=UTF-8");
-                PrintWriter out = servletResponse.getWriter();
-                out.write(JSON.toJSONString(new Response().failure()));
-                return;
-            }
-            filterChain.doFilter(xssRequest, servletResponse);
-        }
-
-
-    }
-
-    // 获取request请求body中参数
-    public static String getBodyString(BufferedReader br) {
-        String inputLine;
-        String str = "";
-        try {
-            while ((inputLine = br.readLine()) != null) {
-                str += inputLine;
-            }
-            br.close();
-        } catch (IOException e) {
-            System.out.println("IOException: " + e);
-        }
-        return str;
-
-    }
-
-    @Override
-    public void destroy() {
-        // no destroy operation
-    }
-}
-
-

+ 13 - 1
src/main/java/com/ssj/service/sys/fx/service/MerchantService.java

@@ -6,12 +6,21 @@ import java.util.Map;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 
+import com.ssj.bean.common.framework.core.domain.Response;
 import com.ssj.bean.sys.fx.domain.Merchant;
-import com.ssj.bean.sys.fx.domain.MerchantSign;
+import com.ssj.bean.sys.role.domain.Admin;
 import com.ssj.framework.core.common.service.BaseService;
 
 public interface MerchantService extends BaseService<Merchant, String> {
 	
+	//保存旧模式的商户
+	Response saveMerchantByUsed(Merchant merchant,String startTime,String endTime
+    		,String password,String province,String city,String area,String schoollist,String location,Admin curadmin);
+	
+	//保存新模式的商户
+	Response saveMerchantByNew(Merchant merchant,String startTime,String endTime,String summaryTime
+    		,String password,String province,String city,String area,String schoollist,String location,Admin curadmin);
+	
 	//导入商户数据,生成帐号
 	String importMerchants(List<Merchant> list,Map<String,String> password);
 	
@@ -120,6 +129,7 @@ public interface MerchantService extends BaseService<Merchant, String> {
 	Merchant getMerchantByVipId(String vipId);
 	
 	boolean unboundVipIdByLibIdToRedis(String vipId,String libId);
+	
 	//通过vipId查出这个绑定机构对应的商户,两个月内绑定的商户
 	Merchant getDefaultMerchantByVipId(String vipId);
 	
@@ -131,6 +141,8 @@ public interface MerchantService extends BaseService<Merchant, String> {
 	
 	List<Merchant> findMerchantSignBySummaryTime();
 	
+	List<Merchant> findMerchantSignByAll();
+	
 
 
 }

+ 447 - 15
src/main/java/com/ssj/service/sys/fx/service/impl/MerchantServiceImpl.java

@@ -21,7 +21,10 @@ import org.springframework.data.repository.PagingAndSortingRepository;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import com.ssj.bean.common.framework.core.domain.Response;
 import com.ssj.bean.sys.fx.domain.Merchant;
+import com.ssj.bean.sys.fx.domain.MerchantArea;
+import com.ssj.bean.sys.fx.domain.MerchantSign;
 import com.ssj.bean.sys.organization.domain.Organization;
 import com.ssj.bean.sys.role.domain.Admin;
 import com.ssj.bean.weixin.libmy.domain.LibVip;
@@ -40,13 +43,17 @@ import com.ssj.framework.core.rabbitmq.TopicRabbitConfig;
 import com.ssj.framework.core.rabbitmq.producer.BaseRabbitSend;
 import com.ssj.framework.core.util.RedisUtil;
 import com.ssj.framework.core.util.SystemResourceLocator;
+import com.ssj.service.sys.fx.service.MerchantAreaService;
 import com.ssj.service.sys.fx.service.MerchantService;
+import com.ssj.service.sys.fx.service.MerchantSignService;
 import com.ssj.service.sys.organization.service.OrganizationService;
 import com.ssj.service.sys.role.service.AdminService;
+import com.ssj.service.sys.role.service.RoleService;
 import com.ssj.service.task.SyncRecordByMerchant;
 import com.ssj.service.weixin.library.service.ILibJoinConsumeService;
 import com.ssj.service.weixin.library.service.ILibJoinService;
 import com.ssj.service.weixin.library.service.ILibVipService;
+import com.ssj.service.weixin.problem.service.CnAreaService;
 import com.ssj.service.weixin.push.service.PushTemplateService;
 import com.ssj.service.weixin.sales.service.LibVipServiceService;
 import com.ssj.taskthread.ThreadPool;
@@ -85,6 +92,18 @@ public class MerchantServiceImpl extends BaseServiceImpl<Merchant, String> imple
     @Autowired
     private PushTemplateService pushTemplateService;
     
+    @Autowired
+    private MerchantAreaService merchantAreaService;
+    
+    @Autowired
+    private CnAreaService cnAreaService;
+    
+    @Autowired
+    private MerchantSignService merchantSignService;
+    
+	@Autowired
+    private RoleService roleService;
+    
 	@Autowired
     private RedisUtil redisUtil;
 	
@@ -117,7 +136,6 @@ public class MerchantServiceImpl extends BaseServiceImpl<Merchant, String> imple
 			if(oldMerchant==null){
 			
 				//添加组织架构
-				String jxcode="SSJ-JX";
 				String fxcode="SSJ-FX";
 				
 				String code="";
@@ -683,20 +701,7 @@ public class MerchantServiceImpl extends BaseServiceImpl<Merchant, String> imple
 		
 	}
 	
-	//是否大于当前时间
-	private static boolean reckonGTCurTime(Date date) {
-		if(date==null) {
-			return false;
-		}
-		Calendar cal = Calendar.getInstance();
-	    cal.setTime(date);//设置起时间
-	    
-	    if(cal.getTime().getTime()>=new Date().getTime()) {
-	    	return true;
-	    }
-	    return false;
-	}
-	
+
 	//日期加上月份,是否小于当前时间
 	private static boolean reckonGTMonth(Date date,Integer monthNum) {
 		if(date==null) {
@@ -1212,6 +1217,433 @@ public class MerchantServiceImpl extends BaseServiceImpl<Merchant, String> imple
 	public List<Merchant> findMerchantSignBySummaryTime() {
 		return dao.findMerchantSignBySummaryTime();
 	}
+
+	@Override
+	public Response saveMerchantByUsed(
+			Merchant merchant,
+			String startTime,String endTime,String password,String province,String city,String area,String schoollist,String location,
+			Admin curadmin) {
+		
+		Response response=new Response();
+		
+		if(StringUtils.isNotEmpty(merchant.getId())){
+			
+				Merchant oldmerchant =this.getById(merchant.getId());
+				
+				if(StringUtils.isNotEmpty(merchant.getLibId())) {
+					Merchant libMerchant=this.getMerchantByLibId(merchant.getLibId());
+					if(libMerchant!=null && !libMerchant.getId().equals(merchant.getId())) {
+						response.failure("您选择的机构已绑定其它商户,不可重复绑定。");
+				        return response;
+					}
+				}
+				
+				oldmerchant.setDeputyName(merchant.getDeputyName());
+				oldmerchant.setDeputyPhone(merchant.getDeputyPhone());
+				oldmerchant.setLegalPerson(merchant.getLegalPerson());
+				oldmerchant.setLevel(merchant.getLevel());
+				oldmerchant.setPhone(merchant.getPhone());
+				oldmerchant.setPrice(merchant.getPrice());
+				oldmerchant.setOutPrice(merchant.getOutPrice());
+				oldmerchant.setStatus(merchant.getStatus());
+				oldmerchant.setRemarks(merchant.getRemarks());
+				oldmerchant.setUnitName(merchant.getUnitName());
+				oldmerchant.setSignService(merchant.getSignService());
+				oldmerchant.setType(merchant.getType());
+				oldmerchant.setHardwareService(merchant.getHardwareService());
+				oldmerchant.setHardwarePrice(merchant.getHardwarePrice());
+				oldmerchant.setAddress(merchant.getAddress());
+				oldmerchant.setLibServiceMonth(0);
+				oldmerchant.setLocation(location);
+				
+				//删除所有关联的学校
+				List<MerchantArea> merchantAreas=merchantAreaService.findSchoolByMerchantList(merchant.getId());
+				for (MerchantArea merchantArea : merchantAreas) {
+					merchantAreaService.delete(merchantArea);
+				}
+				//重新关联学校
+				if(StringUtils.isNotEmpty(schoollist)) {
+					merchantAreas=new ArrayList<MerchantArea>();
+					String[] areaIds=schoollist.split(";");
+					for (String areaId : areaIds) {
+						MerchantArea merchantArea=new MerchantArea();
+						merchantArea.setCnAreaId(areaId);
+						merchantArea.setCreateTime(new Date());
+						merchantArea.setMerchantId(merchant.getId());
+						merchantArea.setSchoolName(cnAreaService.getById(areaId).getName());
+						merchantAreas.add(merchantArea);
+					}
+					merchantAreaService.save(merchantAreas);
+				}
+				
+				//是旧模式兼容,修改了签约的时间,重新计算结算时间
+				if(oldmerchant.getSignTime()==null || DateHelper.parseDate(startTime, "yyyy-MM-dd").getTime()!=oldmerchant.getSignTime().getTime()) {
+					oldmerchant.setSignTime(DateHelper.parseDate(startTime, "yyyy-MM-dd"));
+					oldmerchant.setEndSignTime(DateHelper.parseDate(endTime, "yyyy-MM-dd"));
+					//如果是总部直签的商户,才会更新结算日期,同时更新所有下级的结算日期
+					if("ssj001".equals(oldmerchant.getParentPosCode())) {
+						oldmerchant.setCurSummaryTime(oldmerchant.getSignTime());
+						oldmerchant.setNextSummaryTime(DateHelper.getMonthDate(oldmerchant.getCurSummaryTime(),3));
+						//计算结算日期。
+						this.updateSubMerchantSummaryTime(oldmerchant);
+					}
+				}
+		
+				
+				//商户同步学币/人数 到机构 / 时间
+				if(StringUtils.isNotEmpty(merchant.getLibId())) {
+					oldmerchant.setLibId(merchant.getLibId());
+					TbLibJoin  libJoin= libJoinService.getById(oldmerchant.getLibId());
+					if(libJoin!=null) {
+						libJoin.setLibService(oldmerchant.getLibService());
+						libJoin.setPlatformService(oldmerchant.getPlatformService());
+						
+						libJoin.setSignType(oldmerchant.getSignType());
+						libJoin.setSignTime(oldmerchant.getSignTime());
+						libJoin.setEndSignTime(oldmerchant.getEndSignTime());
+						libJoinService.save(libJoin);
+					}	
+				}
+				
+				this.save(oldmerchant);
+				this.syncRecordByMerchant(curadmin.getLoginName(), oldmerchant.getId(),"", "修改签约商户");
+				
+		}else{
+				Merchant posMerchant =this.getMerchantByPosCode(merchant.getPosCode());
+				if(posMerchant!=null) {
+					response.failure("商户账号不得包含已经创建的商户账号,请重新填写账号。");
+			        return response;
+				}
+				List<Merchant> posCodeMerchants=this.getMerchantByLikePosCode(merchant.getPosCode());
+				if(posCodeMerchants!=null && posCodeMerchants.size()>0){
+					response.failure("商户账号不得包含已经创建的商户账号,请重新填写账号。");
+			        return response;
+				}
+				if(StringUtils.isNotEmpty(merchant.getLibId())) {
+					Merchant libMerchant=this.getMerchantByLibId(merchant.getLibId());
+					if(libMerchant!=null) {
+						response.failure("您选择的机构已绑定其它商户,不可重复绑定。");
+				        return response;
+					}
+				}			
+				Admin admin=adminService.getByLoginName(merchant.getPosCode());
+				if(admin!=null){
+					response.failure("商户账号已存在");
+			        return response;
+				}
+				merchant.setLocation(location);
+				merchant.setPortNum(0);
+				merchant.setLibService(0);
+				merchant.setPlatformService(0);
+				merchant.setHardwareService(0);
+				merchant.setHardwarePrice((double)0);
+				merchant.setLibServiceMonth(0);
+				merchant.setSignTime(startTime!=null ? DateHelper.parseDate(startTime, "yyyy-MM-dd"): null);
+				merchant.setEndSignTime(endTime!=null ? DateHelper.parseDate(endTime, "yyyy-MM-dd"): null);
+				merchant.setCreateTime(new Date());
+				merchant.setSaleLoginName(curadmin.getLoginName());
+				merchant.setCurIsSummary(0);
+				String code="SSJ-FX";
+				if(StringUtils.isNotEmpty(merchant.getParentPosCode())){
+					Merchant pMerchant =this.getMerchantByPosCode(merchant.getParentPosCode());
+					code=pMerchant.getOrgCode()+"-"+merchant.getPosCode();
+				}else{
+					code=code+"-"+merchant.getPosCode(); 
+				}
+				merchant.setOrgCode(code);
+				
+				//添加admin用户信息
+				admin=new Admin();
+				admin.setLoginName(merchant.getPosCode());
+				admin.setNickName(merchant.getPosCode());
+				admin.setCreateTime(new Date());
+				admin.setPassword(MD5.getMD5(password.getBytes()));
+				admin.setStatus(1);
+				adminService.save(admin);
+				
+				//添加商户的权限
+				roleService.saveAdminRole(admin.getId(), "eadc6389-6a29-4864-bce6-a18b30e0a998");
+				
+				//保存商户信息
+				this.save(merchant);
+				
+				if(StringUtils.isNotEmpty(schoollist)) {
+					List<MerchantArea> merchantAreas=new ArrayList<MerchantArea>();
+					String[] areaIds=schoollist.split(";");
+					for (String areaId : areaIds) {
+						MerchantArea merchantArea=new MerchantArea();
+						merchantArea.setCnAreaId(areaId);
+						merchantArea.setCreateTime(new Date());
+						merchantArea.setMerchantId(merchant.getId());
+						merchantAreas.add(merchantArea);
+					}
+					merchantAreaService.save(merchantAreas);
+				}
+				
+				//商户同步学币/人数 到机构 / 时间
+				if(StringUtils.isNotEmpty(merchant.getLibId())) {
+					TbLibJoin  libJoin= libJoinService.getById(merchant.getLibId());
+					if(libJoin!=null) {
+						libJoin.setLibService(merchant.getLibService());
+						libJoin.setPlatformService(merchant.getPlatformService());
+						
+						libJoin.setSignType(merchant.getSignType());
+						libJoin.setSignTime(merchant.getSignTime());
+						libJoin.setEndSignTime(merchant.getEndSignTime());
+						
+						libJoinService.save(libJoin);
+					}	
+				}
+	
+				//判断的是否是旧模式兼容,修改了签约的时间,重新计算结算时间
+				this.computeMerchantSummaryTime(merchant);
+				this.syncRecordByMerchant(curadmin.getLoginName(), merchant.getId(),"", "新增签约商户");
+					
+		}
+		
+		response.success();
+		return response;
+	}
+
+	@Override
+	public Response saveMerchantByNew(
+				Merchant merchant,
+				String startTime,String endTime,String summaryTime,String password,String province,String city,String area,String schoollist,String location,
+				Admin curadmin) {
+		Response response=new Response();
+		
+		if(StringUtils.isNotEmpty(merchant.getId())){
+			
+				Merchant oldmerchant =this.getById(merchant.getId());
+				
+				if(StringUtils.isNotEmpty(merchant.getLibId())) {
+					Merchant libMerchant=this.getMerchantByLibId(merchant.getLibId());
+					if(libMerchant!=null && !libMerchant.getId().equals(merchant.getId())) {
+						response.failure("您选择的机构已绑定其它商户,不可重复绑定。");
+				        return response;
+					}
+				}
+				
+				oldmerchant.setDeputyName(merchant.getDeputyName());
+				oldmerchant.setDeputyPhone(merchant.getDeputyPhone());
+				oldmerchant.setLegalPerson(merchant.getLegalPerson());
+				oldmerchant.setLevel(merchant.getLevel());
+				oldmerchant.setPhone(merchant.getPhone());
+				oldmerchant.setPrice(merchant.getPrice());
+				oldmerchant.setOutPrice(merchant.getOutPrice());
+				oldmerchant.setStatus(merchant.getStatus());
+				oldmerchant.setRemarks(merchant.getRemarks());
+				oldmerchant.setUnitName(merchant.getUnitName());
+				oldmerchant.setSignService(merchant.getSignService());
+				oldmerchant.setType(merchant.getType());
+				oldmerchant.setHardwareService(merchant.getHardwareService());
+				oldmerchant.setHardwarePrice(merchant.getHardwarePrice());
+				oldmerchant.setAddress(merchant.getAddress());
+				oldmerchant.setLibServiceMonth(merchant.getLibServiceMonth());
+				oldmerchant.setNextSummaryTime(summaryTime!=null ? DateHelper.parseDate(summaryTime, "yyyy-MM-dd"): null);
+				oldmerchant.setLocation(location);
+				oldmerchant.setSignTime(startTime!=null ? DateHelper.parseDate(startTime, "yyyy-MM-dd"): null);
+				oldmerchant.setEndSignTime(endTime!=null ? DateHelper.parseDate(endTime, "yyyy-MM-dd"): null);
+				
+				//删除所有关联的学校
+				List<MerchantArea> merchantAreas=merchantAreaService.findSchoolByMerchantList(merchant.getId());
+				for (MerchantArea merchantArea : merchantAreas) {
+					merchantAreaService.delete(merchantArea);
+				}
+				//重新关联学校
+				if(StringUtils.isNotEmpty(schoollist)) {
+					merchantAreas=new ArrayList<MerchantArea>();
+					String[] areaIds=schoollist.split(";");
+					for (String areaId : areaIds) {
+						MerchantArea merchantArea=new MerchantArea();
+						merchantArea.setCnAreaId(areaId);
+						merchantArea.setCreateTime(new Date());
+						merchantArea.setMerchantId(merchant.getId());
+						merchantArea.setSchoolName(cnAreaService.getById(areaId).getName());
+						merchantAreas.add(merchantArea);
+					}
+					merchantAreaService.save(merchantAreas);
+				}
+				
+				//如果修改了套餐的模式,就重新处理数据 加油包
+				if(!oldmerchant.getSignType().equals(merchant.getSignType())) {
+					oldmerchant.setSignType(merchant.getSignType());
+					List<MerchantSign> merchantSigns=merchantSignService.findMerchantSignByMerchantId(merchant.getId(),0);
+					Integer signNum=0;
+					for (MerchantSign merchantSign : merchantSigns) {
+						signNum=signNum+merchantSign.getLibService();
+					}
+					switch (merchant.getSignType()) {
+						case 1:
+							oldmerchant.setLibService(30+signNum);
+							break;
+						case 2:
+							oldmerchant.setLibService(50+signNum);
+							break;
+						case 3:
+							oldmerchant.setLibService(100+signNum);
+							break;
+						default:
+							oldmerchant.setLibService(0);
+							break;
+					}
+					
+					//记录套餐更改记录
+					TbLibJoinConsume consume=new TbLibJoinConsume();
+					consume.setToLibId(merchant.getLibId());
+					consume.setToMerchantId(merchant.getId());
+					consume.setLibService(oldmerchant.getLibService());
+					consume.setPlatformService(0);
+					consume.setType(1);
+					consume.setRemarks("充值【套餐模式更改】");
+					consume.setCreateTime(new Date());
+					libJoinConsumeService.save(consume);
+				}
+				
+				this.save(oldmerchant);
+				
+				//商户同步学币/人数 到机构 / 时间
+				if(StringUtils.isNotEmpty(merchant.getLibId())) {
+					oldmerchant.setLibId(merchant.getLibId());
+					TbLibJoin  libJoin= libJoinService.getById(oldmerchant.getLibId());
+					if(libJoin!=null) {
+						libJoin.setLibService(oldmerchant.getLibService());
+						libJoin.setPlatformService(oldmerchant.getPlatformService());
+						
+						libJoin.setSignType(oldmerchant.getSignType());
+						libJoin.setSignTime(oldmerchant.getSignTime());
+						libJoin.setEndSignTime(oldmerchant.getEndSignTime());
+						libJoinService.save(libJoin);
+					}	
+				}
+				
+				this.syncRecordByMerchant(curadmin.getLoginName(), oldmerchant.getId(),"", "修改套餐商户");
+				
+		}else{
+				Merchant posMerchant =this.getMerchantByPosCode(merchant.getPosCode());
+				if(posMerchant!=null) {
+					response.failure("商户账号不得包含已经创建的商户账号,请重新填写账号。");
+			        return response;
+				}
+				List<Merchant> posCodeMerchants=this.getMerchantByLikePosCode(merchant.getPosCode());
+				if(posCodeMerchants!=null && posCodeMerchants.size()>0){
+					response.failure("商户账号不得包含已经创建的商户账号,请重新填写账号。");
+			        return response;
+				}
+				if(StringUtils.isNotEmpty(merchant.getLibId())) {
+					Merchant libMerchant=this.getMerchantByLibId(merchant.getLibId());
+					if(libMerchant!=null) {
+						response.failure("您选择的机构已绑定其它商户,不可重复绑定。");
+				        return response;
+					}
+				}			
+				Admin admin=adminService.getByLoginName(merchant.getPosCode());
+				if(admin!=null){
+					response.failure("商户账号已存在");
+			        return response;
+				}
+				
+				merchant.setLocation(location);
+				merchant.setPortNum(0);
+				merchant.setLibService(0);
+				merchant.setPlatformService(0);
+				merchant.setHardwareService(0);
+				merchant.setHardwarePrice((double)0);
+				merchant.setCreateTime(new Date());
+				merchant.setSaleLoginName(curadmin.getLoginName());
+				merchant.setCurIsSummary(0);
+				merchant.setNextSummaryTime(summaryTime!=null ? DateHelper.parseDate(summaryTime, "yyyy-MM-dd"): null);
+				merchant.setSignTime(startTime!=null ? DateHelper.parseDate(startTime, "yyyy-MM-dd"):null);
+				merchant.setEndSignTime(endTime!=null ? DateHelper.parseDate(endTime, "yyyy-MM-dd"): null);
+				String code="SSJ-FX";
+				if(StringUtils.isNotEmpty(merchant.getParentPosCode())){
+					Merchant pMerchant =this.getMerchantByPosCode(merchant.getParentPosCode());
+					code=pMerchant.getOrgCode()+"-"+merchant.getPosCode();
+				}else{
+					code=code+"-"+merchant.getPosCode(); 
+				}
+				merchant.setOrgCode(code);
+				switch (merchant.getSignType()) {
+					case 1:
+						merchant.setLibService(30);
+						break;
+					case 2:
+						merchant.setLibService(50);
+						break;
+					case 3:
+						merchant.setLibService(100);
+						break;
+					default:
+						merchant.setLibService(0);
+						break;
+				}
+				
+				//添加admin用户信息
+				admin=new Admin();
+				admin.setLoginName(merchant.getPosCode());
+				admin.setNickName(merchant.getPosCode());
+				admin.setCreateTime(new Date());
+				admin.setPassword(MD5.getMD5(password.getBytes()));
+				admin.setStatus(1);
+				adminService.save(admin);
+				
+				//添加商户的权限
+				roleService.saveAdminRole(admin.getId(), "eadc6389-6a29-4864-bce6-a18b30e0a998");
+				
+				//保存商户信息
+				this.save(merchant);
+				
+				if(StringUtils.isNotEmpty(schoollist)) {
+					List<MerchantArea> merchantAreas=new ArrayList<MerchantArea>();
+					String[] areaIds=schoollist.split(";");
+					for (String areaId : areaIds) {
+						MerchantArea merchantArea=new MerchantArea();
+						merchantArea.setCnAreaId(areaId);
+						merchantArea.setCreateTime(new Date());
+						merchantArea.setMerchantId(merchant.getId());
+						merchantAreas.add(merchantArea);
+					}
+					merchantAreaService.save(merchantAreas);
+				}
+				
+				//商户同步学币/人数 到机构 / 时间
+				if(StringUtils.isNotEmpty(merchant.getLibId())) {
+					TbLibJoin  libJoin= libJoinService.getById(merchant.getLibId());
+					if(libJoin!=null) {
+						libJoin.setLibService(merchant.getLibService());
+						libJoin.setPlatformService(merchant.getPlatformService());
+						
+						libJoin.setSignType(merchant.getSignType());
+						libJoin.setSignTime(merchant.getSignTime());
+						libJoin.setEndSignTime(merchant.getEndSignTime());
+						
+						libJoinService.save(libJoin);
+					}	
+				}
+				
+				
+				//记录开通商户记录
+				TbLibJoinConsume consume=new TbLibJoinConsume();
+				consume.setToLibId(merchant.getLibId());
+				consume.setToMerchantId(merchant.getId());
+				consume.setLibService(merchant.getLibService());
+				consume.setPlatformService(0);
+				consume.setType(1);
+				consume.setRemarks("充值【套餐模式开通】");
+				consume.setCreateTime(new Date());
+				libJoinConsumeService.save(consume);
+	
+				this.syncRecordByMerchant(curadmin.getLoginName(), merchant.getId(),"", "新增套餐商户");
+		}
+		
+		response.success();
+		return response;
+	}
+
+	@Override
+	public List<Merchant> findMerchantSignByAll() {
+		return dao.findMerchantSignByAll();
+	}
 	
 
 }

+ 93 - 90
src/main/java/com/ssj/service/sys/fx/service/impl/MerchantSignServiceImpl.java

@@ -63,112 +63,115 @@ public class MerchantSignServiceImpl extends BaseServiceImpl<MerchantSign, Strin
     //2:处理商户主套餐过期的数据,加油包全过期。
     @Override
 	public void runMerchantSignByEndTime() {
-    	//1:处理加油包过期的数据
-		List<MerchantSign> merchantSigns=dao.findMerchantSignByEndTime();
-		for (MerchantSign merchantSign : merchantSigns) {
-			try {
-				merchantSign.setRemarks("加油包过期");
-				merchantSign.setStatus(1);
-				merchantSign.setUpdateTime(new Date());
-				this.save(merchantSign);
-				
-				Merchant merchant = merchantService.getById(merchantSign.getMerchantId());
-				merchant.setLibService(merchant.getLibService()-merchantSign.getLibService());
-				merchantService.save(merchant);
-	
-				//同步商户表与机构表
-				this.syncMerchantByLibJoin(merchant);
-				
-				//如果加油包过期后,现有的学生大于商户的套餐人数, 就全部学生停止服务。
-				if(StringUtils.isNotEmpty(merchant.getLibId())) {
-					List<LibVip> libVips=libVipService.findByLibId(merchant.getLibId());
-					if(libVips.size()>merchant.getLibService()) {
-						//这里需要调用灿哥的代码。
-						
-					}
-				}
-				
-				//记录加油包记录
-				TbLibJoinConsume consume=new TbLibJoinConsume();
-				consume.setFromLibId(merchant.getLibId());
-				consume.setFromMerchantId(merchant.getId());
-				consume.setLibService(merchantSign.getLibService());
-				consume.setPlatformService(0);
-				consume.setType(2);
-				consume.setRemarks("消费【加油包过期】");
-				consume.setCreateTime(new Date());
-				libJoinConsumeService.save(consume);
-				
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-		}
-		
-		
-		//2:处理商户主套餐过期的数据
-		List<Merchant> merchants=merchantService.findMerchantSignByEndTime();
-		for (Merchant merchant : merchants) {
-			Integer libService=merchant.getLibService();
-			try {
-				List<MerchantSign> signs=this.findMerchantSignByMerchantId(merchant.getId(), 0);
-				for (MerchantSign merchantSign : signs) {
-					merchantSign.setRemarks("主套餐过期引起加油包过期");
+    	try {
+	    	//1:处理加油包过期的数据
+			List<MerchantSign> merchantSigns=dao.findMerchantSignByEndTime();
+			for (MerchantSign merchantSign : merchantSigns) {
+				try {
+					merchantSign.setRemarks("加油包过期");
 					merchantSign.setStatus(1);
 					merchantSign.setUpdateTime(new Date());
 					this.save(merchantSign);
+					
+					Merchant merchant = merchantService.getById(merchantSign.getMerchantId());
+					merchant.setLibService(merchant.getLibService()-merchantSign.getLibService());
+					merchantService.save(merchant);
+		
+					//同步商户表与机构表
+					this.syncMerchantByLibJoin(merchant);
+					
+					//如果加油包过期后,现有的学生大于商户的套餐人数, 就全部学生停止服务。
+					if(StringUtils.isNotEmpty(merchant.getLibId())) {
+						List<LibVip> libVips=libVipService.findByLibId(merchant.getLibId());
+						if(libVips.size()>merchant.getLibService()) {
+							//这里需要调用灿哥的代码。
+							
+						}
+					}
+					
+					//记录加油包记录
+					TbLibJoinConsume consume=new TbLibJoinConsume();
+					consume.setFromLibId(merchant.getLibId());
+					consume.setFromMerchantId(merchant.getId());
+					consume.setLibService(merchantSign.getLibService());
+					consume.setPlatformService(0);
+					consume.setType(2);
+					consume.setRemarks("消费【加油包过期】");
+					consume.setCreateTime(new Date());
+					libJoinConsumeService.save(consume);
+					
+				} catch (Exception e) {
+					e.printStackTrace();
+					logger.error("1:处理加油包过期的数据,异常:"+e.getMessage());
 				}
-				
-				merchant.setSignTime(null);
-				merchant.setEndSignTime(null);
-				merchant.setCurSummaryTime(null);
-				merchant.setNextSummaryTime(null);
-				merchant.setLibService(0);
-				merchantService.save(merchant);
-				
-				this.syncMerchantByLibJoin(merchant);
-				
+			}
+			
+			
+			//2:处理商户结算的数据
+			List<Merchant> summaryMerchants=merchantService.findMerchantSignBySummaryTime();
+			for (Merchant merchant : summaryMerchants) {
 				try {
+					//没有月份了,直接跳出
+					if(merchant.getLibServiceMonth()<=0) {
+						continue;
+					}
+					
+					//处理商户结算的数据
+					//已经够月份了,就终止商户
+					if(merchant.getCurIsSummary()>=(merchant.getLibServiceMonth())) {
+						try {
+							merchant.setCurIsSummary(0);
+							merchant.setCurSummaryTime(null);
+							merchant.setNextSummaryTime(null);
+							merchant.setLibServiceMonth(0);
+							merchant.setLibService(0);
+							merchantService.save(merchant);
+							
+							this.syncMerchantByLibJoin(merchant);
+							
+							List<MerchantSign> signs=this.findMerchantSignByMerchantId(merchant.getId(), 0);
+							for (MerchantSign merchantSign : signs) {
+								merchantSign.setRemarks("套餐过期引起加油包过期");
+								merchantSign.setStatus(1);
+								merchantSign.setUpdateTime(new Date());
+								this.save(merchantSign);
+							}
+							
+							//过期后,现有的学生就全部学生停止服务。
+							//这里需要调用灿哥的代码。
+							
+						} catch (Exception e) {
+							e.printStackTrace();
+							logger.error("3:处理商户结算的数据,异常:"+e.getMessage());
+						}
+						continue;
+					}
+					
+					merchant.setCurIsSummary(merchant.getCurIsSummary()==null ? 1 : merchant.getCurIsSummary()+1);
+					merchant.setCurSummaryTime(new Date());
+					merchant.setNextSummaryTime(DateHelper.getMonthDate(merchant.getCurSummaryTime(),1));
+					merchantService.save(merchant);
+					
 					//记录
 					TbLibJoinConsume consume=new TbLibJoinConsume();
-					consume.setFromLibId(merchant.getLibId());
-					consume.setFromMerchantId(merchant.getId());
-					consume.setLibService(libService);
+					consume.setToLibId(merchant.getLibId());
+					consume.setToMerchantId(merchant.getId());
+					consume.setLibService(merchant.getLibService());
 					consume.setPlatformService(0);
 					consume.setType(2);
-					consume.setRemarks("消费【主套餐过期】");
+					consume.setRemarks("消费【套餐第"+(merchant.getCurIsSummary()+1)+"个月结算】");
 					consume.setCreateTime(new Date());
 					libJoinConsumeService.save(consume);
+					
 				} catch (Exception e) {
 					e.printStackTrace();
+					logger.error("2:处理商户结算的数据,异常:"+e.getMessage());
 				}
 				
-			} catch (Exception e) {
-				e.printStackTrace();
 			}
-		}
-		
-		//2:处理商户结算的数据
-		List<Merchant> summaryMerchants=merchantService.findMerchantSignBySummaryTime();
-		for (Merchant merchant : summaryMerchants) {
-			try {
-				//记录
-				TbLibJoinConsume consume=new TbLibJoinConsume();
-				consume.setToLibId(merchant.getLibId());
-				consume.setToMerchantId(merchant.getId());
-				consume.setLibService(merchant.getLibService());
-				consume.setPlatformService(0);
-				consume.setType(2);
-				consume.setRemarks("消费【套餐月结算】");
-				consume.setCreateTime(new Date());
-				libJoinConsumeService.save(consume);
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-			
-			merchant.setCurIsSummary(0);
-			merchant.setCurSummaryTime(new Date());
-			merchant.setNextSummaryTime(DateHelper.getMonthDate(merchant.getCurSummaryTime(),1));
-			merchantService.save(merchant);
+		} catch (Exception e) {
+			e.printStackTrace();
+			logger.error("12点定时任务,处理套餐的数据,异常:"+e.getMessage());
 		}
 		
 	}

+ 1 - 0
src/main/java/com/ssj/service/sys/train/service/VideoUserService.java

@@ -20,5 +20,6 @@ public interface VideoUserService extends BaseService<VideoUser, String> {
 	
 	public List<VideoUser> findVideoUserByUserIdAndRoleType(Integer roleType,String userId);
 	
+	public List<VideoUser> findVideoUserByUserIdAndVideoId(String videoId, String userId);
 	
 }

+ 5 - 0
src/main/java/com/ssj/service/sys/train/service/impl/VideoUserServiceImpl.java

@@ -50,6 +50,11 @@ public class VideoUserServiceImpl extends BaseServiceImpl<VideoUser, String> imp
 	public List<VideoUser> findVideoUserByUserIdAndRoleType(Integer roleType, String userId) {
 		return videoUserDao.findVideoUserByUserIdAndRoleType(roleType, userId);
 	}
+	
+	@Override
+	public List<VideoUser> findVideoUserByUserIdAndVideoId(String videoId, String userId) {
+		return videoUserDao.findVideoUserByUserIdAndVideoId(videoId, userId);
+	}
 
 	
 

+ 4 - 1
src/main/java/com/ssj/service/weixin/library/service/ILibJoinConsumeService.java

@@ -46,6 +46,9 @@ public interface ILibJoinConsumeService extends BaseService<TbLibJoinConsume, St
 	Integer countMerchantConsumeByConsumeTime(String[] merchantIds,Date startTime,Date endTime);
 	
 	Page<Map<String, Object>> findByPage(Map<String, Object> params, Pageable pageable);
-
+	
+	Integer findTbLibJoinConsumeByFrontDay(String merchantId);
+	
+	Integer findTbLibJoinConsumeByBeforeDays(String merchantId);
 
 }

+ 56 - 46
src/main/java/com/ssj/service/weixin/library/service/impl/LibJoinServiceConsumeImpl.java

@@ -5,6 +5,7 @@ import com.ssj.bean.weixin.libmy.domain.LibVip;
 import com.ssj.bean.weixin.libmy.domain.TbLibJoinConsume;
 import com.ssj.dao.weixin.library.dao.ILibJoinConsumeDao;
 import com.ssj.dao.weixin.library.dao.ILibJoinConsumeQueryDao;
+import com.ssj.framework.basic.utils.DateHelper;
 import com.ssj.framework.core.common.service.BaseServiceImpl;
 import com.ssj.service.sys.fx.service.MerchantService;
 import com.ssj.service.weixin.library.service.ILibJoinConsumeService;
@@ -94,36 +95,10 @@ public class LibJoinServiceConsumeImpl extends BaseServiceImpl<TbLibJoinConsume,
 	//机构消费币
 	@Override
 	public void consumeTbLibJoinConsume(String libId, Integer libServiceNum, Integer platformServiceNum,String vipId) {
-		/*//同步币
-		merchantService.syncLibJoinByMerchant(libId);
-		try {
-			Merchant merchant=null;
-			if(StringUtils.isNotEmpty(libId)) {
-				merchant=merchantService.getMerchantByLibId(libId);
-			}
-			TbLibJoinConsume consume=new TbLibJoinConsume();
-			consume.setFromLibId(libId);
-			consume.setFromMerchantId(merchant!=null ? merchant.getId() : null);
-			consume.setLibService(libServiceNum);
-			consume.setPlatformService(platformServiceNum);
-			consume.setType(2);
-			consume.setRemarks("消费");
-			consume.setCreateTime(new Date());
-			
-			if(StringUtils.isNotEmpty(vipId)) {
-				consume.setVipId(vipId);
-				LibVip libVip=vipService.getById(vipId);
-				if(libVip!=null) {
-					consume.setDerver(libVip.getDerver());
-				}
-			}
-			this.save(consume);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}*/
 		this.batchConsumeTbLibJoinConsume(libId, libServiceNum, platformServiceNum, Arrays.asList(vipId));
 	}
-
+	
+	//机构批量消费币
 	@Override
 	public void batchConsumeTbLibJoinConsume(String libId, Integer libServiceNum, Integer platformServiceNum, List<String> vipIdList){
 		//同步币
@@ -132,31 +107,56 @@ public class LibJoinServiceConsumeImpl extends BaseServiceImpl<TbLibJoinConsume,
 			Merchant merchant = null;
 			if (StringUtils.isNotEmpty(libId)) {
 				merchant = merchantService.getMerchantByLibId(libId);
-			}
-			for (String vipId : vipIdList) {
-				TbLibJoinConsume consume = new TbLibJoinConsume();
-				consume.setFromLibId(libId);
-				consume.setFromMerchantId(merchant != null ? merchant.getId() : null);
-				consume.setLibService(libServiceNum);
-				consume.setPlatformService(platformServiceNum);
-				consume.setType(2);
-				consume.setRemarks("消费");
-				consume.setCreateTime(new Date());
-
-				if (StringUtils.isNotEmpty(vipId)) {
-					consume.setVipId(vipId);
-					LibVip libVip = vipService.getById(vipId);
-					if (libVip != null) {
-						consume.setDerver(libVip.getDerver());
+				if(merchant!=null) {
+					//旧模式,都会记录所有的消费记录,新模式一次性记录消费的
+					if(merchant.getSignType()==1) {
+						for (String vipId : vipIdList) {
+							TbLibJoinConsume consume = new TbLibJoinConsume();
+							consume.setFromLibId(libId);
+							consume.setFromMerchantId(merchant.getId());
+							consume.setLibService(libServiceNum);
+							consume.setPlatformService(platformServiceNum);
+							consume.setType(2);
+							consume.setRemarks("消费");
+							consume.setCreateTime(new Date());
+							if (StringUtils.isNotEmpty(vipId)) {
+								consume.setVipId(vipId);
+								LibVip libVip = vipService.getById(vipId);
+								if (libVip != null) {
+									consume.setDerver(libVip.getDerver());
+								}
+							}
+							this.save(consume);
+						}
+					}else {
+						//如果还没结算过,就当次开始结算
+						if(merchant.getLibServiceMonth()>0 && (merchant.getCurIsSummary()==null || merchant.getCurIsSummary()==0)) {
+							merchant.setCurIsSummary(1);
+							merchant.setCurSummaryTime(new Date());
+							merchant.setNextSummaryTime(DateHelper.getMonthDate(merchant.getCurSummaryTime(),1));
+							merchantService.save(merchant);
+							
+							TbLibJoinConsume consume = new TbLibJoinConsume();
+							consume.setFromLibId(libId);
+							consume.setFromMerchantId(merchant.getId());
+							consume.setLibService(libServiceNum);
+							consume.setPlatformService(platformServiceNum);
+							consume.setType(2);
+							consume.setRemarks("消费【新模式激活消费】");
+							consume.setCreateTime(new Date());
+							this.save(consume);
+						}
 					}
+					
 				}
-				this.save(consume);
+				
 			}
+			
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
 	}
-
+	
 
 	//通过libId分配币
 	@Override
@@ -274,6 +274,16 @@ public class LibJoinServiceConsumeImpl extends BaseServiceImpl<TbLibJoinConsume,
 		return queryDao.findByPage(params, pageable);
 	}
 
+	@Override
+	public Integer findTbLibJoinConsumeByFrontDay(String merchantId) {
+		return dao.findTbLibJoinConsumeByFrontDay(merchantId);
+	}
+
+	@Override
+	public Integer findTbLibJoinConsumeByBeforeDays(String merchantId) {
+		return dao.findTbLibJoinConsumeByBeforeDays(merchantId);
+	}
+
 	
 	 
 }

+ 6 - 189
src/main/java/com/ssj/sys/controller/FxController.java

@@ -72,14 +72,11 @@ import com.ssj.service.conch.parents.v1.dto.PositionSchoolV1Dto;
 import com.ssj.service.sys.fx.service.DeviceActService;
 import com.ssj.service.sys.fx.service.DevicePartsActService;
 import com.ssj.service.sys.fx.service.DevicePartsService;
-import com.ssj.service.sys.fx.service.DeviceSalesService;
 import com.ssj.service.sys.fx.service.DeviceService;
 import com.ssj.service.sys.fx.service.MerchantAreaService;
 import com.ssj.service.sys.fx.service.MerchantService;
 import com.ssj.service.sys.fx.service.MerchantSignService;
-import com.ssj.service.sys.organization.service.OrganizationService;
 import com.ssj.service.sys.role.service.AdminService;
-import com.ssj.service.sys.role.service.RoleService;
 import com.ssj.service.weixin.library.service.ILibJoinConsumeService;
 import com.ssj.service.weixin.library.service.ILibJoinService;
 import com.ssj.service.weixin.problem.service.CnAreaService;
@@ -95,9 +92,6 @@ public class FxController  extends BaseController {
 	private DevicePartsService devicePartsService;
 	
 	@Autowired
-	private DeviceSalesService deviceSalesService;
-	
-	@Autowired
 	private DeviceService deviceService;
 	
 	@Autowired
@@ -113,12 +107,6 @@ public class FxController  extends BaseController {
 	private AdminService adminService;
 	
 	@Autowired
-	private RoleService roleService;
-	
-	@Autowired
-	private OrganizationService  organizationService;
-	
-	@Autowired
     private FileInfoService fileInfoService;   
 	
 	@Autowired
@@ -139,9 +127,6 @@ public class FxController  extends BaseController {
 	@Autowired
 	private MerchantAreaService merchantAreaService;
 
-	
-	
-	
 	//库存管理员查询所有设备
 	@RequestMapping("/deviceAllList")
     public String deviceAllList(Model model,
@@ -1339,187 +1324,19 @@ public class FxController  extends BaseController {
 	
 	@RequestMapping("/saveMerchant")
 	@ResponseBody
-    public Response saveMerchant(Model model,Merchant merchant,String startTime,String endTime
+    public Response saveMerchant(Model model,Merchant merchant,String startTime,String endTime,String summaryTime
     		,String password,String province,String city,String area,String schoollist,String location)throws Exception {
 		HttpSession session = request.getSession();
 		Admin curadmin =(Admin) session.getAttribute("admin");
-		Response response = new  Response();
 		
-		if(StringUtils.isNotEmpty(merchant.getId())){
+		//签约模式
+		if(merchant.getSignType().equals(0)) {
 			
-			Merchant oldmerchant =merchantService.getById(merchant.getId());
-			if(StringUtils.isNotEmpty(merchant.getLibId())) {
-				Merchant libMerchant=merchantService.getMerchantByLibId(merchant.getLibId());
-				if(libMerchant!=null && !libMerchant.getId().equals(merchant.getId())) {
-					response.failure("您选择的机构已绑定其它商户,不可重复绑定。");
-			        return response;
-				}
-			}
-			oldmerchant.setDeputyName(merchant.getDeputyName());
-			oldmerchant.setDeputyPhone(merchant.getDeputyPhone());
-			oldmerchant.setLegalPerson(merchant.getLegalPerson());
-			oldmerchant.setLevel(merchant.getLevel());
-			oldmerchant.setPhone(merchant.getPhone());
-			oldmerchant.setPrice(merchant.getPrice());
-			oldmerchant.setOutPrice(merchant.getOutPrice());
-			oldmerchant.setStatus(merchant.getStatus());
-			oldmerchant.setRemarks(merchant.getRemarks());
-			oldmerchant.setUnitName(merchant.getUnitName());
-			oldmerchant.setSignService(merchant.getSignService());
-			oldmerchant.setType(merchant.getType());
-			oldmerchant.setHardwareService(merchant.getHardwareService());
-			oldmerchant.setHardwarePrice(merchant.getHardwarePrice());
-			oldmerchant.setAddress(merchant.getAddress());
-			oldmerchant.setLocation(location);
-			
-			//删除所有关联的学校
-			List<MerchantArea> merchantAreas=merchantAreaService.findSchoolByMerchantList(merchant.getId());
-			for (MerchantArea merchantArea : merchantAreas) {
-				merchantAreaService.delete(merchantArea);
-			}
-			//重新关联学校
-			if(StringUtils.isNotEmpty(schoollist)) {
-				merchantAreas=new ArrayList<MerchantArea>();
-				String[] areaIds=schoollist.split(";");
-				for (String areaId : areaIds) {
-					MerchantArea merchantArea=new MerchantArea();
-					merchantArea.setCnAreaId(areaId);
-					merchantArea.setCreateTime(new Date());
-					merchantArea.setMerchantId(merchant.getId());
-					merchantArea.setSchoolName(cnAreaService.getById(areaId).getName());
-					merchantAreas.add(merchantArea);
-				}
-				merchantAreaService.save(merchantAreas);
-			}
-			
-			Integer mealNum=0;
-			//如果修改了套餐的模式,就重新处理数据 加油包
-			if(!oldmerchant.getSignType().equals(merchant.getSignType())) {
-				oldmerchant.setSignType(merchant.getSignType());
-				List<MerchantSign> merchantSigns=merchantSignService.findMerchantSignByMerchantId(merchant.getId(),0);
-				Integer signNum=0;
-				for (MerchantSign merchantSign : merchantSigns) {
-					signNum=signNum+merchantSign.getLibService();
-				}
-				switch (merchant.getSignType()) {
-				case 1:
-					oldmerchant.setLibService(30+signNum);
-					mealNum=30;
-					break;
-				case 2:
-					oldmerchant.setLibService(50+signNum);
-					mealNum=50;
-					break;
-				case 3:
-					oldmerchant.setLibService(100+signNum);
-					mealNum=100;
-					break;
-				default:
-					oldmerchant.setLibService(0);
-					break;
-				}
-			}
-			
-			//判断的是否是旧模式兼容,修改了签约的时间,重新计算结算时间
-			if(merchant.getSignType()==0) {
-				if(oldmerchant.getSignTime()==null || DateHelper.parseDate(startTime, "yyyy-MM-dd").getTime()!=oldmerchant.getSignTime().getTime()) {
-					oldmerchant.setSignTime(DateHelper.parseDate(startTime, "yyyy-MM-dd"));
-					oldmerchant.setEndSignTime(DateHelper.parseDate(endTime, "yyyy-MM-dd"));
-					//如果是总部直签的商户,才会更新结算日期,同时更新所有下级的结算日期
-					if("ssj001".equals(oldmerchant.getParentPosCode())) {
-						oldmerchant.setCurSummaryTime(oldmerchant.getSignTime());
-						oldmerchant.setNextSummaryTime(DateHelper.getMonthDate(oldmerchant.getCurSummaryTime(),3));
-						//计算结算日期。
-						merchantService.updateSubMerchantSummaryTime(oldmerchant);
-					}
-				}
-			}else {
-				oldmerchant.setSignTime(DateHelper.parseDate(startTime, "yyyy-MM-dd"));
-				oldmerchant.setEndSignTime(DateHelper.parseDate(endTime, "yyyy-MM-dd"));
-				oldmerchant.setCurSummaryTime(oldmerchant.getSignTime());
-				oldmerchant.setNextSummaryTime(DateHelper.getMonthDate(oldmerchant.getCurSummaryTime(),1));
-			}
-			
-			//商户同步学币/人数 到机构 / 时间
-			if(StringUtils.isNotEmpty(merchant.getLibId())) {
-				oldmerchant.setLibId(merchant.getLibId());
-				TbLibJoin  libJoin= libJoinService.getById(oldmerchant.getLibId());
-				if(libJoin!=null) {
-					libJoin.setLibService(oldmerchant.getLibService());
-					libJoin.setPlatformService(oldmerchant.getPlatformService());
-					
-					libJoin.setSignType(oldmerchant.getSignType());
-					libJoin.setSignTime(oldmerchant.getSignTime());
-					libJoin.setEndSignTime(oldmerchant.getEndSignTime());
-					libJoinService.save(libJoin);
-				}	
-			}
-			
-			merchantService.save(oldmerchant);
-			merchantService.syncRecordByMerchant(curadmin.getLoginName(), oldmerchant.getId(),WebUtil.getRemoteAddr(request), "修改商户");
-			
-			//记录加油包记录
-			if(mealNum>0) {
-				TbLibJoinConsume consume=new TbLibJoinConsume();
-				consume.setToLibId(merchant.getLibId());
-				consume.setToMerchantId(merchant.getId());
-				consume.setLibService(oldmerchant.getLibService());
-				consume.setPlatformService(0);
-				consume.setType(1);
-				consume.setRemarks("充值【套餐模式更改】");
-				consume.setCreateTime(new Date());
-				libJoinConsumeService.save(consume);
-			}
-			
-		}else{
-			List<Merchant> posCodeMerchants=merchantService.getMerchantByLikePosCode(merchant.getPosCode());
-			if(posCodeMerchants!=null && posCodeMerchants.size()>0){
-				response.failure("商户账号不得包含已经创建的商户账号,请重新填写账号。");
-		        return response;
-			}
-			if(StringUtils.isNotEmpty(merchant.getLibId())) {
-				Merchant libMerchant=merchantService.getMerchantByLibId(merchant.getLibId());
-				if(libMerchant!=null) {
-					response.failure("您选择的机构已绑定其它商户,不可重复绑定。");
-			        return response;
-				}
-			}			
-			Admin admin=adminService.getByLoginName(merchant.getPosCode());
-			if(admin!=null){
-				response.failure("商户账号已存在");
-		        return response;
-			}
-			merchant.setLocation(location);
-			merchant.setPortNum(0);
-			merchant.setLibService(0);
-			merchant.setPlatformService(0);
-			merchant.setHardwareService(0);
-			merchant.setHardwarePrice((double)0);
+	        return merchantService.saveMerchantByUsed(merchant, startTime, endTime, password, province, city, area, schoollist, location, curadmin);
+		}else {
 			
-			merchant.setSignTime(DateHelper.parseDate(startTime, "yyyy-MM-dd"));
-			merchant.setEndSignTime(DateHelper.parseDate(endTime, "yyyy-MM-dd"));
-			if(merchant.getSignType()!=0) {
-				merchant.setCurSummaryTime(merchant.getSignTime());
-				merchant.setNextSummaryTime(DateHelper.getMonthDate(merchant.getCurSummaryTime(),1));
-			}
-			switch (merchant.getSignType()) {
-			case 1:
-				merchant.setLibService(30);
-				break;
-			case 2:
-				merchant.setLibService(50);
-				break;
-			case 3:
-				merchant.setLibService(100);
-				break;
-			default:
-				merchant.setLibService(0);
-				break;
-			}
-			adminService.saveFXAdmin(merchant, password, curadmin.getLoginName(), province, city, area,schoollist,WebUtil.getRemoteAddr(request));
+	        return merchantService.saveMerchantByNew(merchant, startTime, endTime, summaryTime, password, province, city, area, schoollist, location, curadmin);
 		}
-		response.success("成功");
-        return response;
     }
 	
 	

+ 21 - 4
src/main/java/com/ssj/task/sz/MerchantSummaryTask.java

@@ -10,6 +10,7 @@ import org.springframework.stereotype.Component;
 
 import com.ssj.framework.core.util.SystemResourceLocator;
 import com.ssj.service.sys.fx.service.MerchantService;
+import com.ssj.service.sys.fx.service.MerchantSignService;
 
 @DisallowConcurrentExecution
 @Component
@@ -19,14 +20,30 @@ public class MerchantSummaryTask implements Job{
 	
 	@Override
 	public void execute(JobExecutionContext context) throws JobExecutionException {
-		MerchantService merchantService = SystemResourceLocator.getBean(MerchantService.class);
+		
+		//12点定时任务,处理签约模式的数据
 		try{
-			logger.error("结算扣币定时任务,00点启动任务....start....");
+			MerchantService merchantService = SystemResourceLocator.getBean(MerchantService.class);
+			logger.error("【签约模式】结算扣币定时任务,开始...");
 			merchantService.runSummaryByMerchant_new();
-			logger.error("结算扣币定时任务,00点启动任务....end....");
+			logger.error("【签约模式】结算扣币定时任务,结束。");
 		}catch (Exception e) {
-			logger.error("结算扣币定时任务,00点启动异常-->"+e.getMessage());
+			logger.error("【签约模式】结算扣币定时任务,异常:"+e.getMessage());
 		}
+		
+		//12点定时任务,处理套餐的数据
+	    //1:处理加油包过期的数据
+	    //2:处理商户主套餐过期的数据,加油包全过期。
+		try{
+			MerchantSignService merchantSignService = SystemResourceLocator.getBean(MerchantSignService.class);
+			logger.error("【套餐模式】处理套餐的数据定时任务,开始...");
+			merchantSignService.runMerchantSignByEndTime();
+			logger.error("【套餐模式】处理套餐的数据定时任务,结束。");
+		}catch (Exception e) {
+			logger.error("【套餐模式】处理套餐的数据定时任务,异常:"+e.getMessage());
+		}
+		
+		
 
 	}
 }

+ 21 - 8
src/main/resources/templates/sys/fx/merchantAdd.html

@@ -125,17 +125,17 @@ dtext{
 				<label>套餐:套餐模式<b>*</b></label>
 				<div class="vocation" style="margin-right: 5px; width: 345px">
 					<select name="signType" id="signType" class="select1"  > 
-						<option value="0" th:selected="${merchant.signType==0 ? true : false}">旧模式</option>
-						<option value="1" th:selected="${merchant.signType==1 ? true : false}">优选套餐(服务包1</option>
-						<option value="2" th:selected="${merchant.signType==2 ? true : false}">VIP套餐(服务包2</option>
-						<option value="3" th:selected="${merchant.signType==3 ? true : false}">尊享套餐(服务包3</option>
+						<option value="0" th:selected="${merchant.signType==0 ? true : false}">合同签约模式(旧模式</option>
+						<option value="1" th:selected="${merchant.signType==1 ? true : false}">服务包1</option>
+						<option value="2" th:selected="${merchant.signType==2 ? true : false}">服务包2</option>
+						<option value="3" th:selected="${merchant.signType==3 ? true : false}">服务包3</option>
 					</select>
 				</div>
 				<label th:if="${merchant.id!=null}"  style="width: 230px;color:red">[修改套餐模式,不会影响加油包有效性 ]</label>
 			</li>
-			
+
 			<li>
-				<label>[合同签约]/[套餐模式]时间:<b >*</b></label>
+				<label><b >【合同签约模式】</b>签约时间:<b >*</b></label>
 				<input type="hidden"  id="minDate" value="2020-01-01" >
 				<input type="text" id="signTime" name="signTime"  onfocus="WdatePicker({dateFmt:'yyyy-MM-dd',minDate:'#F{$dp.$D(\'minDate\')}'})" autocomplete="off" th:value="${#dates.format(merchant.signTime, 'yyyy-MM-dd')}" class="scinput date_width " placeholder="开始时间">
 				&nbsp;&nbsp;&nbsp;~~&nbsp;&nbsp;
@@ -143,7 +143,17 @@ dtext{
 			</li>
 			
 			<li>
-				<label>签约数量(练习册用):<b>*</b></label>
+				<label><b >【套餐模式】</b>套餐购买月份:<b>*</b></label>
+				<input type="number" id="libServiceMonth" min="0" class="dfinput fl" name="libServiceMonth" th:value="${merchant.libServiceMonth!=null ? merchant.libServiceMonth : 0}"/>
+			</li>
+			
+			<li>
+				<label><b >【套餐模式】</b>结算时间:<b >*</b></label>
+				<input type="text"  class="dfinput fl"  id="nextSummaryTime" name="nextSummaryTime"  onfocus="WdatePicker({dateFmt:'yyyy-MM-dd',autoPickDate:true,minDate:'%y-%M-%d'})" autocomplete="off" th:value="${#dates.format(merchant.nextSummaryTime, 'yyyy-MM-dd')}" placeholder="结算时间">
+			</li>
+			
+			<li>
+				<label>签约数量【练习册用】:<b>*</b></label>
 				<input type="text" id="signService" class="dfinput fl" name="signService" th:value="${merchant.signService!=null ? merchant.signService : 0}"/>
 			</li>
 			
@@ -153,7 +163,7 @@ dtext{
 			</li>
 			
 			<li >
-				<label>上级商户:上级渠道<b >*</b></label>
+				<label>上级商户【上级渠道】<b >*</b></label>
 				<div class="vocation" style="margin-right: 5px; width: 345px">
 					<select name="parentposcode" id="parentposcode" class="select1" th:disabled="${merchant.id!=null || curMerchant.orgCode ne 'SSJ-FX' ? 'true' : 'false'}" > 
 						<option th:if="${merchant.id==null || merchant.parentPosCode=='' || merchant.parentPosCode==null }" data-orgcode="" data-id="" value="" >无商户上级</option>
@@ -737,6 +747,9 @@ function save(){
             'startTime':$("#signTime").val(),
             'endTime':$("#endSignTime").val(),
             
+            'libServiceMonth':$("#libServiceMonth").val(),
+            'summaryTime':$("#nextSummaryTime").val(),
+            
             'province':$("#province").val(),
             'city':$("#city").val(),
 			'address':$("#address").val(),