shenhao пре 4 година
родитељ
комит
65ac9a000d
25 измењених фајлова са 1034 додато и 183 уклоњено
  1. 7 0
      pom.xml
  2. 150 58
      src/main/java/com/ssj/api/controller/ApiWxController.java
  3. 2 1
      src/main/java/com/ssj/bean/weixin/order/domain/Order.java
  4. 20 0
      src/main/java/com/ssj/bean/weixin/sales/domain/LibOrderDetails.java
  5. 27 2
      src/main/java/com/ssj/bean/weixin/sales/domain/LibSalesPrice.java
  6. 1 1
      src/main/java/com/ssj/dao/sys/fx/dao/impl/FxQueryDaoImpl.java
  7. 3 2
      src/main/java/com/ssj/dao/weixin/order/dao/impl/OrderQueryDaoImpl.java
  8. 7 0
      src/main/java/com/ssj/dao/weixin/sales/dao/LibSalesPriceDao.java
  9. 26 3
      src/main/java/com/ssj/framework/weixin/pay/OrderHelper.java
  10. 16 1
      src/main/java/com/ssj/framework/weixin/pay/OrderUtil.java
  11. 14 8
      src/main/java/com/ssj/service/kmt/correctsys/KmtCorrectSysServiceImpl.java
  12. 13 0
      src/main/java/com/ssj/service/kmt/correctsys/dto/HomeworkPictureCheckDto.java
  13. 2 0
      src/main/java/com/ssj/service/weixin/order/service/OrderService.java
  14. 70 2
      src/main/java/com/ssj/service/weixin/order/service/impl/OrderServiceImpl.java
  15. 9 0
      src/main/java/com/ssj/service/weixin/sales/service/LibSalesPriceService.java
  16. 10 0
      src/main/java/com/ssj/service/weixin/sales/service/impl/LibSalesPriceServiceImpl.java
  17. 71 20
      src/main/java/com/ssj/sys/controller/FxController.java
  18. 8 6
      src/main/java/com/ssj/sys/controller/SysSalesController.java
  19. 1 0
      src/main/resources/static/js/qrcode.min.js
  20. 20 3
      src/main/resources/templates/sys/fx/merchantAllEdit.html
  21. 531 0
      src/main/resources/templates/sys/fx/merchantMealSelfAdd.html
  22. 1 1
      src/main/resources/templates/sys/lib/libJoinAdd.html
  23. 1 0
      src/main/resources/templates/sys/order/orderList.html
  24. 15 39
      src/main/resources/templates/sys/sales/libSalesPriceAdd.html
  25. 9 36
      src/main/resources/templates/sys/sales/libSalesPriceList.html

+ 7 - 0
pom.xml

@@ -244,6 +244,13 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-mail</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>com.github.wechatpay-apiv3</groupId>
+            <artifactId>wechatpay-apache-httpclient</artifactId>
+            <version>0.2.2</version>
+        </dependency>
+
     </dependencies>
 
     <!-- Package as an executable jar -->

+ 150 - 58
src/main/java/com/ssj/api/controller/ApiWxController.java

@@ -1,58 +1,150 @@
-package com.ssj.api.controller;
-
-import java.util.Map;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import com.ssj.api.security.annotation.IgnoreSecurity;
-import com.ssj.framework.core.common.controller.BaseController;
-import com.ssj.framework.core.security.manager.TokenManager;
-import com.ssj.framework.core.util.ResponseConstant;
-import com.ssj.framework.core.util.ResponseEntity;
-
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-
-@Api(value = "微信相关的", tags = "微信相关的")
-@RestController
-@RequestMapping("/open/api/wx")
-public class ApiWxController extends BaseController {
-	
-	@Autowired
-	private TokenManager tokenManager;
-	
-	@IgnoreSecurity
-	@RequestMapping(value = "/accessToken")
-    @ApiOperation(value = "获取accessToken接口",  notes = "获取accessToken接口")
-    public ResponseEntity getAccessToken() {
-        ResponseEntity responseEntity = new ResponseEntity();
-        try {
-        	Map<String, Object> data =tokenManager.getSSJAccessTokenAndTime();
-            responseEntity.success(data, "获取accessToken成功");
-        } catch (Exception e) {
-            logger.error("获取accessToken接口", e);
-            responseEntity.failure(ResponseConstant.CODE_500, "系统繁忙,请稍后重试");
-        }
-        return responseEntity;
-    }
-	
-	
-	@IgnoreSecurity
-	@RequestMapping(value = "/jsAccessToken")
-    @ApiOperation(value = "获取jsAccessToken接口",  notes = "获取jsAccessToken接口")
-    public ResponseEntity getJSAccessToken() {
-        ResponseEntity responseEntity = new ResponseEntity();
-        try {
-        	Map<String, Object> data =tokenManager.getSSJJSAccessTokenAndTime();
-            responseEntity.success(data, "获取accessToken成功");
-        } catch (Exception e) {
-            logger.error("获取accessToken接口", e);
-            responseEntity.failure(ResponseConstant.CODE_500, "系统繁忙,请稍后重试");
-        }
-        return responseEntity;
-    }
-	
-	
-}
+package com.ssj.api.controller;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.alibaba.fastjson.JSON;
+import com.ssj.bean.sys.fx.domain.Merchant;
+import com.ssj.bean.weixin.push.domain.SendTemplateShort;
+import com.ssj.bean.weixin.sales.domain.LibOrderDetails;
+import com.ssj.framework.basic.utils.DateHelper;
+import com.ssj.framework.core.util.SystemResourceLocator;
+import com.ssj.framework.weixin.pay.util.XMLUtil;
+import com.ssj.service.sys.fx.service.MerchantMealService;
+import com.ssj.service.sys.fx.service.MerchantService;
+import com.ssj.service.weixin.order.service.OrderService;
+import com.ssj.service.weixin.push.service.PushTemplateService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.ssj.api.security.annotation.IgnoreSecurity;
+import com.ssj.framework.core.common.controller.BaseController;
+import com.ssj.framework.core.security.manager.TokenManager;
+import com.ssj.framework.core.util.ResponseConstant;
+import com.ssj.framework.core.util.ResponseEntity;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Api(value = "微信相关的", tags = "微信相关的")
+@RestController
+@RequestMapping("/open/api/wx")
+public class ApiWxController extends BaseController {
+	
+	@Autowired
+	private TokenManager tokenManager;
+
+    @Autowired
+    private MerchantService merchantService;
+
+    @Autowired
+    private MerchantMealService merchantMealService;
+
+    @Autowired
+    private OrderService orderService;
+	
+	@IgnoreSecurity
+	@RequestMapping(value = "/accessToken")
+    @ApiOperation(value = "获取accessToken接口",  notes = "获取accessToken接口")
+    public ResponseEntity getAccessToken() {
+        ResponseEntity responseEntity = new ResponseEntity();
+        try {
+        	Map<String, Object> data =tokenManager.getSSJAccessTokenAndTime();
+            responseEntity.success(data, "获取accessToken成功");
+        } catch (Exception e) {
+            logger.error("获取accessToken接口", e);
+            responseEntity.failure(ResponseConstant.CODE_500, "系统繁忙,请稍后重试");
+        }
+        return responseEntity;
+    }
+	
+	
+	@IgnoreSecurity
+	@RequestMapping(value = "/jsAccessToken")
+    @ApiOperation(value = "获取jsAccessToken接口",  notes = "获取jsAccessToken接口")
+    public ResponseEntity getJSAccessToken() {
+        ResponseEntity responseEntity = new ResponseEntity();
+        try {
+        	Map<String, Object> data =tokenManager.getSSJJSAccessTokenAndTime();
+            responseEntity.success(data, "获取accessToken成功");
+        } catch (Exception e) {
+            logger.error("获取accessToken接口", e);
+            responseEntity.failure(ResponseConstant.CODE_500, "系统繁忙,请稍后重试");
+        }
+        return responseEntity;
+    }
+
+    @IgnoreSecurity
+    /**
+     * 服务包支付成功回调方法
+     * @param request
+     * @param response
+     * @throws Exception
+     */
+    @RequestMapping("/pay_communication_callback")
+    public void pay_communication_callback(HttpServletRequest request, HttpServletResponse response) throws Exception {
+        logger.info("===服务包续费支付成功回调方法");
+        InputStream inStream = request.getInputStream();
+        ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
+        byte[] buffer = new byte[1024];
+        int len;
+        while ((len = inStream.read(buffer)) != -1) {
+            outSteam.write(buffer, 0, len);
+        }
+        outSteam.close();
+        inStream.close();
+        //获取微信调用我们notify_url的返回信息
+        String result = new String(outSteam.toByteArray(), "utf-8");
+        logger.info("服务包续费支付回调result:" + result);
+        if (result != null) {
+            Map<String, Object> map = XMLUtil.doXMLParse(result);
+            if (map != null && map.get("result_code").toString().equalsIgnoreCase("SUCCESS")) {
+                String orderNo = map.get("out_trade_no").toString();
+                LibOrderDetails libOrderDetails = tokenManager.get(orderNo, LibOrderDetails.class);
+                logger.info("==支付回调=orderNo-" + orderNo + "(libOrderDetails)" + JSON.toJSONString(libOrderDetails));
+                if (libOrderDetails != null) {
+                    String key = "call"+orderNo;
+                    String value = tokenManager.getString(key);
+                    if(value ==null){
+                        tokenManager.setString(key, "1");
+                        try {
+                            Merchant merchant = merchantService.getById(libOrderDetails.getUserId());
+                            double unitPrice = libOrderDetails.getPrice().divide(new BigDecimal(libOrderDetails.getNumber())).divide(new BigDecimal(libOrderDetails.getType())).doubleValue();
+                            if (merchant.getPosType() == 2) {
+                                merchantMealService.saveMerchantMeal(merchant.getId(), 5, libOrderDetails.getType(), libOrderDetails.getNumber(), 0, unitPrice, libOrderDetails.getPrice().doubleValue(), libOrderDetails.getStartActiveTime(), libOrderDetails.getActiveTime());
+                            } else { //3
+                                String endActiveTime = DateHelper.format(DateHelper.getMonthDate(DateHelper.parseDate(libOrderDetails.getActiveTime(), "yyyy-MM-dd"), libOrderDetails.getNumber()), "yyyy-MM-dd");
+                                merchantMealService.saveMerchantMealSC(merchant.getId(), 5, libOrderDetails.getType(), libOrderDetails.getActiveTime(), endActiveTime, unitPrice, libOrderDetails.getPrice().doubleValue(), null);
+                            }
+
+                        } catch (Exception e) {
+                            PushTemplateService pushTemplateService = SystemResourceLocator.getBean(PushTemplateService.class);
+                            Map<String, String> data = new HashMap<>(16);
+                            data.put("first", "续费支付回调通知发生异常\n");
+                            data.put("keyword1", "订单号");
+                            data.put("keyword2", orderNo);
+                            data.put("keyword3", "无价格");
+                            data.put("keyword4", DateHelper.format(new Date(), "yyyy年MM月dd日 HH:mm "));
+                            data.put("remark", "\n请及时处理");
+                            String template_id_short = (String) SystemResourceLocator.getValue("sendTemplate102");
+                            SendTemplateShort sendTemplateShort = new SendTemplateShort("otguNv1cJwHSa3E79U7QsEuFYIyo", template_id_short, null, data);
+                            pushTemplateService.savePushWxTemplate(sendTemplateShort);
+                            logger.error("任务失败:" + e.getMessage(), e);
+                        }
+                    }
+                     orderService.updateOrderStatus(orderNo, map.get("transaction_id").toString(), 1);
+                }
+            }
+            //告诉微信服务器,我收到信息了,不要在调用回调action了
+            response.getWriter().write(XMLUtil.setXML("SUCCESS", "OK"));
+        }
+    }
+}

+ 2 - 1
src/main/java/com/ssj/bean/weixin/order/domain/Order.java

@@ -34,6 +34,7 @@ public class Order  extends BaseEntity{
 	  *  9私塾家-一对一支付酬金
 	  *  11私塾家-作业吧支付酬金
 	  *  13私塾家-找好课支付酬金
+	  * 14 商户续费
 	  */
 	 private Integer orderType;//订单类型 
 	 
@@ -42,7 +43,7 @@ public class Order  extends BaseEntity{
 	 // 订单状态 0-未支付, 1-已支付, 2-已取消 ,3-已完成,4-退款  
 	 private Integer orderStatus;
 	 
-	 private Integer payBy;//支付方式   1 H5 ,2小程序,3app
+	 private Integer payBy;//支付方式   1 H5 ,2小程序,3app,4 native
 	 
 	 private Date payTime;//支付成功时间
 	 

+ 20 - 0
src/main/java/com/ssj/bean/weixin/sales/domain/LibOrderDetails.java

@@ -175,6 +175,10 @@ public class LibOrderDetails  extends BaseEntity{
 	 */
 	private Integer invoiceState;
 
+	private String startActiveTime;
+
+	private String activeTime;
+
 	public Date getStartTime() {
 		return startTime;
 	}
@@ -408,4 +412,20 @@ public class LibOrderDetails  extends BaseEntity{
 	public void setInvoiceState(Integer invoiceState) {
 		this.invoiceState = invoiceState;
 	}
+	@Transient
+	public String getStartActiveTime() {
+		return startActiveTime;
+	}
+
+	public void setStartActiveTime(String startActiveTime) {
+		this.startActiveTime = startActiveTime;
+	}
+	@Transient
+	public String getActiveTime() {
+		return activeTime;
+	}
+
+	public void setActiveTime(String activeTime) {
+		this.activeTime = activeTime;
+	}
 }

+ 27 - 2
src/main/java/com/ssj/bean/weixin/sales/domain/LibSalesPrice.java

@@ -65,10 +65,21 @@ public class LibSalesPrice extends BaseEntity {
 	 */
 	private String describe;
 
+	/**
+	 * 最小人数
+	 */
+	private Integer minCount;
+
+	/**
+	 * 最大人数
+	 */
+	private Integer maxCount;
+	@Column(updatable = false)
 	public String getDescribe() {
 		return describe;
 	}
 
+
 	public void setDescribe(String describe) {
 		this.describe = describe;
 	}
@@ -144,6 +155,20 @@ public class LibSalesPrice extends BaseEntity {
 	public void setAliases(String aliases) {
 		this.aliases = aliases;
 	}
-	 
-	 
+
+	public Integer getMinCount() {
+		return minCount;
+	}
+
+	public void setMinCount(Integer minCount) {
+		this.minCount = minCount;
+	}
+
+	public Integer getMaxCount() {
+		return maxCount;
+	}
+
+	public void setMaxCount(Integer maxCount) {
+		this.maxCount = maxCount;
+	}
 }

+ 1 - 1
src/main/java/com/ssj/dao/sys/fx/dao/impl/FxQueryDaoImpl.java

@@ -905,7 +905,7 @@ public class FxQueryDaoImpl implements FxQueryDao {
         selSql.append(" 	SELECT m.id,m.type as merchant_type,m.pos_code,m.unit_name,t.unit_price,t.price,t.buy_month,t.give_month,t.sign_type,t.type,t.lib_service,t.create_time as time,1 as cap_type from fx_merchant_meal_order t    ");
         selSql.append("  	LEFT JOIN fx_merchant m ON t.merchant_id=m.id ");
         selSql.append("  UNION ALL");
-        selSql.append("  	SELECT m.id,m.type as merchant_type,m.pos_code,m.unit_name,IF(t.remarks is NOT NULL,0,o.unit_price),IF(t.remarks is NOT NULL,0,o.price),o.buy_month,o.give_month,o.sign_type,o.type,t.lib_service,t.sign_time as time,2 as cap_type from fx_merchant_meal t  ");
+        selSql.append("  	SELECT m.id,m.type as merchant_type,m.pos_code,m.unit_name,IF(t.remarks='开始计费期',0,o.unit_price),IF(t.remarks='开始计费期',0,o.price),o.buy_month,o.give_month,o.sign_type,o.type,t.lib_service,t.sign_time as time,2 as cap_type from fx_merchant_meal t  ");
         selSql.append("  	LEFT JOIN fx_merchant m ON t.merchant_id=m.id ");
         selSql.append(" 	LEFT JOIN fx_merchant_meal_order o ON t.order_id=o.id where t.status=1 and t.type>1 ");//激活期的流水,不统计到资金流水表
         selSql.append("  UNION ALL");

+ 3 - 2
src/main/java/com/ssj/dao/weixin/order/dao/impl/OrderQueryDaoImpl.java

@@ -29,8 +29,9 @@ public class OrderQueryDaoImpl implements OrderQueryDao{
 			Map<String, Object> searchParams, Pageable pageable) {
 		 StringBuilder selSQL = new StringBuilder();
 	        List<Object> queryParams = new ArrayList<Object>();
-	        selSQL.append(" SELECT   o.* ,u.wx_name ,r.create_time as refund_time from  tb_orders o join  tb_user  u  ");
-	        selSQL.append("  on o.user_id  = u.id  ");
+	        selSQL.append(" SELECT   o.* ,ifnull(u.wx_name,f.unit_name) as wx_name ,r.create_time as refund_time from  tb_orders o  ");
+	        selSQL.append("  left join  tb_user  u  on o.user_id  = u.id  ");
+	        selSQL.append("  left join  fx_merchant  f  on o.user_id  = f.lib_id  ");
 	        selSQL.append("  LEFT JOIN  tb_order_refund  r  on  o.order_no = r.order_no  ");
 	        if(searchParams!=null && searchParams.size()>0){
 	        	selSQL.append("  where 1=1 ");

+ 7 - 0
src/main/java/com/ssj/dao/weixin/sales/dao/LibSalesPriceDao.java

@@ -49,4 +49,11 @@ public interface LibSalesPriceDao  extends JpaRepository<LibSalesPrice, String>{
 
 	LibSalesPrice findTopBySpecies(String species);
 
+	@Query(nativeQuery = true, value = " select *  from   tb_lib_sales_price  where lib_id = ?1 and ?2 between min_count and max_count   ")
+    LibSalesPrice getByLibIdAndCount(String libId, int libService);
+
+	@Query(nativeQuery = true, value = " INSERT  into   tb_lib_sales_price ( id,species,type,price,discount,create_time,lib_id ,name,aliases,min_count,max_count )\n" +
+			"SELECT  UUID(),species,type,price,discount ,now(),?1 ,name ,aliases,min_count,max_count  from  tb_lib_sales_price where lib_id =?2 and species=?3 ")
+	@Modifying
+	void initSalesPrice(String libId, String ssj, String x001);
 }

+ 26 - 3
src/main/java/com/ssj/framework/weixin/pay/OrderHelper.java

@@ -551,7 +551,30 @@ public class OrderHelper {
 		
     	return result;
     }
-    
-    
-	
+
+
+	public Map<String, Object> reqestNativeOrder(String total_fee, String order_no, String desc, String url) throws Exception{
+		SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();
+
+		parameters.put("appid", ConfigUtil.APPID);//"wxb36078b375f8c63a"
+//		parameters.put("appid", "wx0a35910236825df6");//"wxb36078b375f8c63a"
+		parameters.put("mch_id", ConfigUtil.MCH_ID);//商户号"1360047702"  1433580402
+		parameters.put("nonce_str", CommonUtil.CreateNoncestr());
+		parameters.put("body", desc);//支付商品详情
+		parameters.put("out_trade_no", order_no);//商户系统内部的订单号,32个字符内、可包含字母
+		parameters.put("total_fee", total_fee);//订单总金额,单位为分 total_fee
+		parameters.put("spbill_create_ip",CommonUtil.getIpAddress());//此处获取用户端的ip,APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP。IpAddressUtil.getIpAddr(request)
+		parameters.put("notify_url",url);//接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。如:http://www.weixin.qq.com/wxpay/pay.php
+		parameters.put("trade_type", "NATIVE");
+		String sign = PayCommonUtil.createSign("UTF-8", parameters,ConfigUtil.PAYKEY);
+		parameters.put("sign", sign);
+		String requestXML = PayCommonUtil.getRequestXml(parameters);
+		logger.info("===请求微信统一下单接口参数准备完毕:");
+		logger.info(requestXML);
+		String result =  HttpUtil.httpsRequest(ConfigUtil.UNIFIED_ORDER_URL, "POST", requestXML);
+		logger.info("===请求微信统一下单接口返回结果:");
+		logger.info(result);
+		Map<String, Object> map = XMLUtil.doXMLParse(result);
+		return map;
+	}
 }

+ 16 - 1
src/main/java/com/ssj/framework/weixin/pay/OrderUtil.java

@@ -52,6 +52,21 @@ public class OrderUtil {
         Random random = new Random();  
         int rannum = (int) (random.nextDouble() * (99999 - 10000 + 1)) + 10000;// 获取5位随机数  
         return base + str + rannum;// 当前时间  
-    } 
+    }
+    /**
+     * 生成native订单号
+     *
+     * @return
+     */
+    public static String getOrderCodeNative() {
+    	String base = "ssjnative";
+        SimpleDateFormat simpleDateFormat;
+        simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
+        Date date = new Date();
+        String str = simpleDateFormat.format(date);
+        Random random = new Random();
+        int rannum = (int) (random.nextDouble() * (99999 - 10000 + 1)) + 10000;// 获取5位随机数
+        return base + str + rannum;// 当前时间
+    }
   
 }  

+ 14 - 8
src/main/java/com/ssj/service/kmt/correctsys/KmtCorrectSysServiceImpl.java

@@ -146,13 +146,14 @@ public class KmtCorrectSysServiceImpl implements KmtCorrectSysService {
      * @param id
      * @param path
      */
-    private void addVagueNoCheckResult(List<HomeworkPictureCheckDto> result, String id, String path, int secondType) {
+    private void addVagueNoCheckResult(List<HomeworkPictureCheckDto> result, String id, String path, int secondType,int isDelete) {
         HomeworkPictureCheckDto vagueCheckDto = new HomeworkPictureCheckDto();
         //无需质检
         vagueCheckDto.setType(4);
         vagueCheckDto.setSecondType(secondType);
         vagueCheckDto.setHomeworkPictureId(id);
         vagueCheckDto.setPath(path);
+        vagueCheckDto.setIsDelete(isDelete);
         result.add(vagueCheckDto);
     }
 
@@ -376,6 +377,7 @@ public class KmtCorrectSysServiceImpl implements KmtCorrectSysService {
                 HomeworkPicture homeworkPicture = this.copyHomeworkPictureDto2HomeworkPicture(homeworkPictureDto);
                 HomeworkPictureCheckDto homeworkPictureCheckDto = null;
 
+
                 //模糊和不全的,需要查询模糊表
                 List<HomeworkPictureVagueRecord> vagueRecords =
                         homeworkPictureVagueRecordService.findByHomeworkPictureId(homeworkPicture.getId());
@@ -394,7 +396,7 @@ public class KmtCorrectSysServiceImpl implements KmtCorrectSysService {
                                     if (!homeworkPictureVagueRecord.getPictureVaguePath().equals(homeworkPicture.getFileKey())) {
                                         this.addVagueNoCheckResult(result, homeworkPictureVagueRecord.getId(),
                                                 homeworkPictureVagueRecord.getPictureVaguePath(),
-                                                this.isOtherTeachersWork(teacherId, homeworkPicture, 1) ? 4 : 1);
+                                                this.isOtherTeachersWork(teacherId, homeworkPicture, 1) ? 4 : 1,homeworkPicture.getIsDelete());
                                     }
                                 }
                             }
@@ -404,7 +406,7 @@ public class KmtCorrectSysServiceImpl implements KmtCorrectSysService {
                                     if (!homeworkPictureVagueRecord.getPictureVaguePath().equals(homeworkPicture.getFileKey())) {
                                         this.addVagueNoCheckResult(result, homeworkPictureVagueRecord.getId(),
                                                 homeworkPictureVagueRecord.getPictureVaguePath(),
-                                                this.isOtherTeachersWork(teacherId, homeworkPicture, 1) ? 4 : 2);
+                                                this.isOtherTeachersWork(teacherId, homeworkPicture, 1) ? 4 : 2,homeworkPicture.getIsDelete());
                                     }
                                 }
                             }
@@ -415,7 +417,7 @@ public class KmtCorrectSysServiceImpl implements KmtCorrectSysService {
                                         homeworkPictureVagueRecord.getPictureVaguePath(),
                                         this.isOtherTeachersWork(teacherId, homeworkPicture, 1) ? 4
                                                 : homeworkPictureVagueRecord.getType() == 3 ? 2 :
-                                                homeworkPictureVagueRecord.getType());
+                                                homeworkPictureVagueRecord.getType(),homeworkPicture.getIsDelete());
                             }
                         }
                     }
@@ -439,6 +441,7 @@ public class KmtCorrectSysServiceImpl implements KmtCorrectSysService {
                                         4 : 2);
                             }
                             vagueCheckDto.setPath(homeworkPicture.getFileKey());
+                            vagueCheckDto.setIsDelete(homeworkPicture.getIsDelete());
                             result.add(vagueCheckDto);
                             //作业模糊后补拍
                         } else if (homeworkPicture.getIsMark() == 2) {
@@ -454,6 +457,7 @@ public class KmtCorrectSysServiceImpl implements KmtCorrectSysService {
                                 if (homeworkPicture.getIsCheckerCorrect() > 0) {
                                     homeworkPictureCheckDto.setSecondType(12);
                                 }
+                                homeworkPictureCheckDto.setIsDelete(homeworkPicture.getIsDelete());
                                 result.add(homeworkPictureCheckDto);
                             }
                         }
@@ -473,6 +477,7 @@ public class KmtCorrectSysServiceImpl implements KmtCorrectSysService {
                         if (homeworkPicture.getIsCheckerCorrect() > 0) {
                             homeworkPictureCheckDto.setSecondType(12);
                         }
+                        homeworkPictureCheckDto.setIsDelete(homeworkPicture.getIsDelete());
                         result.add(homeworkPictureCheckDto);
                     }
 
@@ -501,11 +506,12 @@ public class KmtCorrectSysServiceImpl implements KmtCorrectSysService {
                     if (homeworkPicture.getIsCheckerCorrect() > 0) {
                         homeworkPictureCheckDto.setSecondType(12);
                     }
-
+                    homeworkPictureCheckDto.setIsDelete(homeworkPicture.getIsDelete());
                     result.add(homeworkPictureCheckDto);
                 }
             }
         }
+
         return result;
     }
 
@@ -804,7 +810,7 @@ public class KmtCorrectSysServiceImpl implements KmtCorrectSysService {
                                     if (!homeworkPictureVagueRecord.getPictureVaguePath().equals(homeworkPicture.getFileKey())) {
                                         this.addVagueNoCheckResult(result, homeworkPictureVagueRecord.getId(),
                                                 homeworkPictureVagueRecord.getPictureVaguePath(),
-                                                this.isOtherTeachersWork(teacherId, homeworkPicture, 1) ? 4 : 1);
+                                                this.isOtherTeachersWork(teacherId, homeworkPicture, 1) ? 4 : 1,homeworkPicture.getIsDelete());
                                     }
                                 }
                             }
@@ -814,7 +820,7 @@ public class KmtCorrectSysServiceImpl implements KmtCorrectSysService {
                                     if (!homeworkPictureVagueRecord.getPictureVaguePath().equals(homeworkPicture.getFileKey())) {
                                         this.addVagueNoCheckResult(result, homeworkPictureVagueRecord.getId(),
                                                 homeworkPictureVagueRecord.getPictureVaguePath(),
-                                                this.isOtherTeachersWork(teacherId, homeworkPicture, 1) ? 4 : 2);
+                                                this.isOtherTeachersWork(teacherId, homeworkPicture, 1) ? 4 : 2,homeworkPicture.getIsDelete());
                                     }
                                 }
                             }
@@ -825,7 +831,7 @@ public class KmtCorrectSysServiceImpl implements KmtCorrectSysService {
                                         homeworkPictureVagueRecord.getPictureVaguePath(),
                                         this.isOtherTeachersWork(teacherId, homeworkPicture, 1) ? 4
                                                 : homeworkPictureVagueRecord.getType() == 3 ? 2 :
-                                                homeworkPictureVagueRecord.getType());
+                                                homeworkPictureVagueRecord.getType(),homeworkPicture.getIsDelete());
                             }
                         }
                     }

+ 13 - 0
src/main/java/com/ssj/service/kmt/correctsys/dto/HomeworkPictureCheckDto.java

@@ -38,6 +38,11 @@ public class HomeworkPictureCheckDto implements Serializable {
      */
     private String checkTime;
 
+    /**
+     * 是否非学科
+     */
+    private int isDelete = 0;
+
     private List<ExerciseQuestionAnswer4CorrectDTO>  answers = new ArrayList<>();
 
     private HomeworkPictureCheckHowDetailDto howDetail = null;
@@ -123,4 +128,12 @@ public class HomeworkPictureCheckDto implements Serializable {
     public void setCompositionCommentModuleList(List<CompositionCommentModuleDTO> compositionCommentModuleList) {
         this.compositionCommentModuleList = compositionCommentModuleList;
     }
+
+    public int getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(int isDelete) {
+        this.isDelete = isDelete;
+    }
 }

+ 2 - 0
src/main/java/com/ssj/service/weixin/order/service/OrderService.java

@@ -98,4 +98,6 @@ public interface OrderService extends BaseService<Order, String>{
 	 public Map<String, Object>  payInfo(User user,String total_fee,String pay_type);
 	 public Map<String, Object>  payVIP(User user,LibOrderDetails libOrderDetails);
 	 public ResponseEntity  refund(String orderId,BigDecimal refund_fee,String  userId);
+
+	Map<String,String> nativePayInfo(String id,String libId,String priceId, Integer libService, Integer buyMonth, String startActiveTime, String activeTime);
 }

+ 70 - 2
src/main/java/com/ssj/service/weixin/order/service/impl/OrderServiceImpl.java

@@ -5,6 +5,7 @@ import com.ssj.bean.weixin.libmy.domain.TbLibJoin;
 import com.ssj.bean.weixin.order.domain.Order;
 import com.ssj.bean.weixin.order.domain.OrderRefund;
 import com.ssj.bean.weixin.sales.domain.LibOrderDetails;
+import com.ssj.bean.weixin.sales.domain.LibSalesPrice;
 import com.ssj.bean.weixin.sales.domain.LibVipCode;
 import com.ssj.bean.weixin.user.domain.User;
 import com.ssj.dao.weixin.order.dao.OrderDao;
@@ -24,6 +25,7 @@ import com.ssj.service.weixin.library.service.IBookManagerService;
 import com.ssj.service.weixin.library.service.ILibJoinService;
 import com.ssj.service.weixin.order.service.OrderRefundService;
 import com.ssj.service.weixin.order.service.OrderService;
+import com.ssj.service.weixin.sales.service.LibSalesPriceService;
 import com.ssj.service.weixin.sales.service.LibVipCodeService;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -57,7 +59,11 @@ public class OrderServiceImpl extends BaseServiceImpl<Order, String> implements
 	@Autowired
 	private TokenManager tokenManager;
 	@Autowired
-	private OrderRefundService orderRefundService;//退款	  
+	private OrderRefundService orderRefundService;//退款
+
+	@Autowired
+	private LibSalesPriceService libSalesPriceService;
+
 	@Override
 	public PagingAndSortingRepository<Order, String> getDao() {
 		return orderDao;
@@ -430,5 +436,67 @@ public class OrderServiceImpl extends BaseServiceImpl<Order, String> implements
 		return responseEntity;
 		
 	}
-	
+
+	@Override
+	public Map<String,String> nativePayInfo(String id,String libId,String priceId, Integer libService, Integer buyMonth, String startActiveTime, String activeTime) {
+		Map<String,String> data = new HashMap<>();
+		String desc = "私塾家-商户小塾学伴续费";
+		LibOrderDetails libOrderDetails = new LibOrderDetails();
+		libOrderDetails.setLibId(libId);
+		libOrderDetails.setUserId(id);
+		libOrderDetails.setSalesPriceId(priceId);
+		libOrderDetails.setNumber(buyMonth);
+		//不是用于新签续签,这里用于端口数
+		libOrderDetails.setType(libService);
+		libOrderDetails.setActiveTime(activeTime);
+		libOrderDetails.setStartActiveTime(startActiveTime);
+
+		LibSalesPrice libSalesPrice=libSalesPriceService.getById(libOrderDetails.getSalesPriceId());
+		libOrderDetails.setPrice(libSalesPrice.getPrice().multiply(new BigDecimal(libService)).multiply(new BigDecimal(buyMonth)));
+
+
+		logger.info("私塾家-商户小塾学伴续费:"+libOrderDetails.getPrice());
+		//生成订单号
+		String orderNo = OrderUtil.getOrderCodeNative();
+
+		OrderHelper orderHelper = new OrderHelper();
+		String baseUrl = SystemResourceLocator.getValue("gz_sys_url").toString();
+		String url = baseUrl +"/open/api/wx/pay_communication_callback";
+		String code_url = "";
+		String orderId = "";
+		try {
+			//请求微信统一下单接口,获取最重要的prepay_id.
+			Map<String,Object> map = orderHelper.reqestNativeOrder(libOrderDetails.getPrice().multiply(new BigDecimal(100)).setScale(0,BigDecimal.ROUND_HALF_UP).toString(),orderNo,desc,url);
+			String prepay_id = (String) map.get("prepay_id");
+			code_url = map.get("code_url")+"";
+			logger.info("===微信统一下单接口返回的prepay_id:"+prepay_id);
+			logger.info("===微信统一下单native接口返回的code_url:"+code_url);
+			//微信统一下单接口返回后,生成订单保存到数据库
+			Order o = new Order();
+			o.setOrderMoney(libOrderDetails.getPrice());
+			o.setOrderNo(orderNo);
+			o.setOrderStatus(0);
+			o.setPrepayId(prepay_id);
+			o.setCreateTime(new Date());
+			o.setUserId(libId);
+			//4-native
+			o.setPayBy(4);
+			o.setIsClosed(0);
+			o.setOrderType(14);
+			o=this.save(o);
+			orderId = o.getId();
+			libOrderDetails.setCreateTime(new Date());
+			libOrderDetails.setOrderId(o.getId());
+			libOrderDetails.setOrderNo(orderNo);
+			tokenManager.set(orderNo, libOrderDetails,7 * 24 * 3600);//存放redis
+			logger.info("==发起支付=orderNo-"+orderNo+"(libOrderDetails)"+JSON.toJSONString(libOrderDetails));
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		data.put("nativeCodeUrl",code_url);
+		data.put("orderId",orderId);
+		return data;
+	}
+
 }

+ 9 - 0
src/main/java/com/ssj/service/weixin/sales/service/LibSalesPriceService.java

@@ -33,4 +33,13 @@ public interface LibSalesPriceService extends BaseService<LibSalesPrice, String>
 	 
 	 public LibSalesPrice findByLibIdAndSpeciesAndType(String libId,String species ,String type);
 
+	/**
+	 * 商户售服务价格调整
+	 * @param libId
+	 * @param libService
+	 * @return
+	 */
+     LibSalesPrice getByLibIdAndCount(String libId, int libService);
+
+     void initSalesPrice(String libId);
 }

+ 10 - 0
src/main/java/com/ssj/service/weixin/sales/service/impl/LibSalesPriceServiceImpl.java

@@ -73,4 +73,14 @@ public class LibSalesPriceServiceImpl extends BaseServiceImpl<LibSalesPrice, Str
 		return libSalesPriceDao.findByLibIdAndSpeciesAndType(libId, species, type);
 	}
 
+	@Override
+	public LibSalesPrice getByLibIdAndCount(String libId, int libService) {
+		return libSalesPriceDao.getByLibIdAndCount(libId,libService);
+	}
+
+	@Override
+	public void initSalesPrice(String libId) {
+		libSalesPriceDao.initSalesPrice(libId,"SSJ","X001");
+	}
+
 }

+ 71 - 20
src/main/java/com/ssj/sys/controller/FxController.java

@@ -3,25 +3,31 @@ package com.ssj.sys.controller;
 import java.beans.BeanInfo;
 import java.beans.Introspector;
 import java.beans.PropertyDescriptor;
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
 import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 
+import com.alibaba.fastjson.JSON;
+import com.ssj.bean.weixin.order.domain.Order;
+import com.ssj.bean.weixin.push.domain.SendTemplateShort;
+import com.ssj.bean.weixin.sales.domain.LibOrderDetails;
+import com.ssj.bean.weixin.sales.domain.LibSalesPrice;
 import com.ssj.conch.util.TimeUtils;
+import com.ssj.framework.core.util.*;
+import com.ssj.framework.weixin.pay.util.XMLUtil;
+import com.ssj.service.weixin.order.service.OrderService;
+import com.ssj.service.weixin.push.service.PushTemplateService;
+import com.ssj.service.weixin.sales.service.LibSalesPriceService;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFCellStyle;
 import org.apache.poi.hssf.util.HSSFColor;
@@ -66,10 +72,6 @@ import com.ssj.bean.weixin.problem.domain.CnArea;
 import com.ssj.framework.basic.common.bean.SplitPage;
 import com.ssj.framework.basic.utils.DateHelper;
 import com.ssj.framework.core.common.controller.BaseController;
-import com.ssj.framework.core.util.PropertiesUtil;
-import com.ssj.framework.core.util.ResponseConstant;
-import com.ssj.framework.core.util.ResponseEntity;
-import com.ssj.framework.core.util.WebUtil;
 import com.ssj.framework.files.service.FileInfoService;
 import com.ssj.framework.idworker.IdWorker;
 import com.ssj.service.conch.conch.service.ConchDerverService;
@@ -158,6 +160,12 @@ public class FxController  extends BaseController {
 	@Autowired
 	private MerchantAreaService merchantAreaService;
 
+	@Autowired
+    private OrderService orderService;
+
+    @Autowired
+    private LibSalesPriceService libSalesPriceService;
+
 	//库存管理员查询所有设备
 	@RequestMapping("/deviceAllList")
     public String deviceAllList(Model model,
@@ -5389,15 +5397,58 @@ public class FxController  extends BaseController {
 		response.success("操作成功");
 		return response;
 	}
-	
-	
-	
-	
-	
-	
-	
-	
-	
+
+    //商户自行续费端口服务包开通(服务包5)
+    @RequestMapping("/merchantMealSelfAdd")
+    public String merchantMealSelfAdd(Model model,String id){
+        Merchant merchant=merchantService.getById(id);
+        int libService =  merchant.getLibService();
+        List<LibSalesPrice> lists = libSalesPriceService.findByLibId(merchant.getLibId());
+        if(Objects.isNull(lists) || lists.size()==0){
+            libSalesPriceService.initSalesPrice(merchant.getLibId());
+        }
+        LibSalesPrice libSalesPrice=libSalesPriceService.getByLibIdAndCount(merchant.getLibId(),libService);
+
+        List<MerchantMealOrder> list=merchantMealOrderService.findMerchantMealOrderAll(id);
+        Date activeTime = new Date();
+        MerchantMeal merchantMeal=merchantMealService.getMerchantMealByMaxEndSignTime(id);
+        if(Objects.nonNull(list) && list.size()>0 && Objects.nonNull(merchantMeal)) {
+            activeTime=merchantMeal.getEndSignTime();
+        }
+
+        model.addAttribute("merchant", merchant);
+        model.addAttribute("priceId", libSalesPrice.getId());
+        model.addAttribute("price", libSalesPrice.getPrice());
+        model.addAttribute("startActiveTime", null);
+        model.addAttribute("activeTime", activeTime);
+        model.addAttribute("list", list);
+        return "sys/fx/merchantMealSelfAdd";
+    }
+
+    @RequestMapping(value="/nativeOrder")
+    @ResponseBody
+    public ResponseEntity nativeOrder(Model model,String id,String priceId,Integer libService,Integer buyMonth,String startActiveTime,String activeTime) {
+        ResponseEntity response = new  ResponseEntity();
+        Merchant merchant=merchantService.getById(id);
+
+
+        Map<String,String> data = orderService.nativePayInfo(id,merchant.getLibId(),priceId,libService,buyMonth,startActiveTime,activeTime);
+        response.success(data,"操作成功");
+        return response;
+    }
+
+
+
+    @RequestMapping(value="/checkOrderState")
+    @ResponseBody
+    public ResponseEntity checkOrderState(Model model,String orderId) {
+        ResponseEntity response = new  ResponseEntity();
+        Order order = orderService.getById(orderId);
+        Map<String,Object> data = new HashMap<>();
+        data.put("state",order.getOrderStatus());
+        response.success(data,"操作成功");
+        return response;
+    }
 	
 	
 	

+ 8 - 6
src/main/java/com/ssj/sys/controller/SysSalesController.java

@@ -327,11 +327,14 @@ public class SysSalesController extends BaseController {
 					@RequestParam(required = false, defaultValue = "1") int pageNo)
 					throws Exception {
 				Map<String, Object> params = new HashMap<String, Object>();
-				params.put("EQ_libId", "SSJ");
-				params.put("EQ_type", request.getParameter("EQ_type")==null?"":request.getParameter("EQ_type"));
-				params.put("EQ_species", request.getParameter("EQ_species")==null?"":request.getParameter("EQ_species"));
+				params.put("EQ_libId", request.getParameter("libId"));
+			  List<LibSalesPrice> lists = libSalesPriceService.findByLibId(request.getParameter("libId"));
+			  if(Objects.isNull(lists) || lists.size()==0){
+				  libSalesPriceService.initSalesPrice(request.getParameter("libId"));
+			  }
+				params.put("EQ_species", "X001");
 				SplitPage sp = new SplitPage();
-			    sp.setAction(request.getRequestURI().toString());
+			    sp.setAction(request.getRequestURI());
 			    sp.setPageNo(pageNo);
 			    sp.setPageSize(pageSize);
 			    sp.setParams(params);
@@ -341,8 +344,7 @@ public class SysSalesController extends BaseController {
 				model.addAttribute("listNavigatHtml", sp.getSysPaginHtml());
 				model.addAttribute("page", sp);
 				model.addAttribute("search", params);
-				model.addAttribute("cardType", sortService.getParamValByCode("cardType"));
-				model.addAttribute("species", sortService.getParamValByCode("species"));
+				model.addAttribute("libId", request.getParameter("libId"));
 				return "sys/sales/libSalesPriceList";
 			}
 		  @RequestMapping("/libSalesPriceAdd")

Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
src/main/resources/static/js/qrcode.min.js


+ 20 - 3
src/main/resources/templates/sys/fx/merchantAllEdit.html

@@ -343,10 +343,10 @@
 							<a href="javascript:;" th:if="${item.posType==3 && item.status!=1 && (curMerchant.orgCode eq 'SSJ-FX' || #strings.contains(item.orgCode,curMerchant.orgCode) ) }"  th:onclick="'libServiceScAdd(\''+${item.id}+'\')'" class="tablelink">服务包</a>
 							
 							<a href="javascript:;" th:if="${item.signType!=0 && item.status!=1 && (curMerchant.orgCode eq 'SSJ-FX' || #strings.contains(item.orgCode,curMerchant.orgCode) ) }"  th:onclick="'signServiceAdd(\''+${item.id}+'\')'" class="tablelink">加油包</a>
-								
+							<a href="javascript:;" th:onclick="'openNew2(\''+${item.libId}+'\')'" th:if="${item.status!=1 && item.libId != null}"   class="tablelink">设置</a>
 						</di>
-						
-					 </td>  
+						<a href="javascript:;" th:if="${item.status!=1 && item.libId != null}"  th:onclick="'libServiceXfAdd(\''+${item.id}+'\')'" class="tablelink">续费</a>
+					 </td>
 					
 					
 			</tr>
@@ -690,6 +690,19 @@ function libServiceScAdd(id){
 	});
 }
 
+function libServiceXfAdd(id){
+	var title="购买服务包";
+	parent.layer.open({
+		type: 2,
+		title: title,
+		closeBtn: 1, //不显示关闭按钮
+		shift: 0.8,
+		offset: '10%',
+		area: ['1015px', '60%'],
+		content: '[[${sysUrl}]]/sys/fx/merchantMealSelfAdd.html?id='+id
+	});
+}
+
 function signServiceAdd(id){
 	var title="购买加油包";
 	parent.layer.open({
@@ -797,6 +810,10 @@ function joinServiceEdit(id){
 		//@{/sys/admin/curator/index.html(libId=${item.libId})}
 		window.open('[[${sysUrl}]]/sys/admin/curator/index.html?libId='+libId);
 	}
+	function  openNew2(libId) {
+		//@{/sys/admin/curator/index.html(libId=${item.libId})}
+		window.open('[[${sysUrl}]]/sys/sales/libSalesPriceList.html?libId='+libId);
+	}
 		function merchantallot(type){
 			var id=$("#merchant_id").val();
 			var title="";

+ 531 - 0
src/main/resources/templates/sys/fx/merchantMealSelfAdd.html

@@ -0,0 +1,531 @@
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+<title>私塾家</title>
+<script th:include="sys/common/metaCSS" th:remove="tag"></script> 
+<script th:include="sys/common/metaJS" th:remove="tag"></script> 
+<script src="sys/js/My97DatePicker/WdatePicker.js" th:src="@{/static/sys/js/My97DatePicker/WdatePicker.js}"></script>
+<script src="sys/js/qrcode.min.js" th:src="@{/static/js/qrcode.min.js}"></script>
+</head>
+<style>
+	.tablelink{margin-right:10px;}
+	.stylecss{
+	      color: red;
+	}
+	.select_width{
+	     width: 220px;
+	}
+	.date_width{
+	     width: 150px;
+	}
+	
+	.tablelist th,td{
+		white-space: nowrap;
+		text-overflow: ellipsis;
+		overflow: hidden;
+	}
+	#mealServiceAdd .zwfb_shop_table {
+		margin-top: 10px
+	}
+	#mealServiceAdd tbody {
+	    display: table-row-group;
+	    vertical-align: middle;
+    	border-color: inherit;
+	}
+	#mealServiceAdd .fwmc_xxk {
+	    overflow: hidden;
+	    margin-left: 20px;
+	}
+	#mealServiceAdd .fwmc_xxk li {
+	    float: left;
+	    width: 150px;
+	    height: 52px;
+	    border: 1px solid #ddd;
+	    font-size: 18px;
+	    color: #666;
+	    margin-right: 30px;
+	    text-align: center;
+	    margin-bottom: 10px;
+	    overflow: hidden;
+	    cursor: pointer;
+	}
+	#mealServiceAdd .fwmc_xxk li p {
+	    line-height: 18px;
+	    font-size: 12px;
+	    color: #999;
+	    margin-top: 5px;
+	}
+	#mealServiceAdd .zwsl_num {
+	    margin-left: 20px;
+	    font-size: 16px;
+	    color: #333;
+	}
+	#mealServiceAdd .zwsl_num span {
+	    color: #999;
+	    font-size: 12px;
+	    padding-left: 10px;
+	}
+	#mealServiceAdd .nmb_jj {
+	    overflow: hidden;
+	    margin-left: 20px;
+	}
+	#mealServiceAdd .nmb_jj li.jian {
+	    border-right: none;
+	    cursor: pointer;
+	    color: #999;
+	    width: 30px;
+	    padding: 0;
+	}
+	#mealServiceAdd .nmb_jj li {
+	    float: left;
+	    text-align: center;
+	    line-height: 30px;
+	    border: 1px solid #ddd;
+	    font-size: 20px;
+	    padding: 0 8px;
+	}
+	#mealServiceAdd .nmb_jj li .srkk {
+	    width: 30px;
+	    font-size: 16px;
+	    border: none;
+	    line-height: 30px;
+	    text-align: center;
+	    outline: 0;
+	    background: #FFF;
+	}
+	#mealServiceAdd .nmb_jj li.jia {
+	    border-left: none;
+	    cursor: pointer;
+	    color: #999;
+	    width: 30px;
+	    padding: 0;
+	}
+	#mealServiceAdd a.ty_but {
+	    width: 130px;
+	    height: 40px;
+	    line-height: 40px;
+	    text-align: center;
+	    display: block;
+	    font-size: 16px;
+	    color: #fff;
+	    border-radius: 3px;
+	    background: #169ed8;
+	}
+	#mealServiceAdd a.ty_but:hover {
+	    background: #1187ba;
+	}
+	#mealServiceAdd .fwmc_xxk li.sign_type_select_on {
+	    background: url(/static/sys/images/fwkk.jpg) no-repeat center;
+	    color: #169ed8;
+	    border: 1px solid #169ed8;
+	}
+	
+	
+	
+	
+	
+	
+	#libServiceAdd .zwfb_shop_table {
+		margin-top: 10px
+	}
+	#libServiceAdd tbody {
+	    display: table-row-group;
+	    vertical-align: middle;
+    	border-color: inherit;
+	}
+	#libServiceAdd .fwmc_xxk {
+	    overflow: hidden;
+	    margin-left: 20px;
+	}
+	#libServiceAdd .fwmc_xxk li {
+	    float: left;
+	    width: 150px;
+	    height: 52px;
+	    border: 1px solid #ddd;
+	    font-size: 18px;
+	    color: #666;
+	    margin-right: 30px;
+	    text-align: center;
+	    margin-bottom: 25px;
+	    overflow: hidden;
+	    cursor: pointer;
+	}
+	#libServiceAdd .fwmc_xxk li p {
+	    line-height: 18px;
+	    font-size: 12px;
+	    color: #999;
+	    margin-top: 5px;
+	}
+	#libServiceAdd .zwsl_num {
+	    margin-left: 20px;
+	    font-size: 16px;
+	    color: #333;
+	}
+	#libServiceAdd .zwsl_num span {
+	    color: #999;
+	    font-size: 12px;
+	    padding-left: 10px;
+	}
+	#libServiceAdd .nmb_jj {
+	    overflow: hidden;
+	    margin-left: 20px;
+	}
+	#libServiceAdd .nmb_jj li.jian {
+	    border-right: none;
+	    cursor: pointer;
+	    color: #999;
+	    width: 30px;
+	    padding: 0;
+	}
+	#libServiceAdd .nmb_jj li {
+	    float: left;
+	    text-align: center;
+	    line-height: 30px;
+	    border: 1px solid #ddd;
+	    font-size: 20px;
+	    padding: 0 8px;
+	}
+	#libServiceAdd .nmb_jj li .srkk {
+	    width: 30px;
+	    font-size: 16px;
+	    border: none;
+	    line-height: 30px;
+	    text-align: center;
+	    outline: 0;
+	    background: #FFF;
+	}
+	#libServiceAdd .nmb_jj li.jia {
+	    border-left: none;
+	    cursor: pointer;
+	    color: #999;
+	    width: 30px;
+	    padding: 0;
+	}
+	#libServiceAdd a.ty_but {
+	    width: 130px;
+	    height: 40px;
+	    line-height: 40px;
+	    text-align: center;
+	    display: block;
+	    font-size: 16px;
+	    color: #fff;
+	    border-radius: 3px;
+	    background: #169ed8;
+	}
+	#libServiceAdd a.ty_but:hover {
+	    background: #1187ba;
+	}
+	#libServiceAdd .fwmc_xxk li.sign_type_select_on {
+	    background: url(/static/sys/images/fwkk.jpg) no-repeat center;
+	    color: #169ed8;
+	    border: 1px solid #169ed8;
+	}
+	
+	
+	
+</style>
+<body style="min-width: 100%;">
+
+<div class="rightinfo">
+	<div class="formbody" id="libServiceAdd" >
+		<input type="hidden" id="id" th:value="${merchant.id}" >
+		<input type="hidden" id="priceId" th:value="${priceId}" >
+		<input type="hidden" id="orderId"  value="0">
+		<table border="0" cellspacing="0" cellpadding="0" class="zwfb_shop_table">
+		      <tbody>
+		       <tr id="lib_service_tr"  valign="top">
+		  			<td align="right" width="70" style="line-height: 30px;font-weight: 700">服务人数量:</td>
+		  	        <td>
+			        	<ul class="nmb_jj">
+				            <li class="jian" id="1_reduce_num">-</li>
+				            <li>
+				              <input name="" id="1_service_num" type="text" value="0" class="srkk" style="width: 50px;">
+				            </li>
+				            <li class="jia" id="1_add_num">+</li>  
+			          </ul>
+			        </td>
+		      </tr>
+		      <tr >
+		        <td height="20"></td>
+		        <td></td>
+		      </tr>
+		      
+		     <tr valign="top" th:if="${startActiveTime!=null}">
+	  			<td align="right" width="70" style="line-height: 30px;font-weight: 700">合同激活日期:</td>
+	  	        <td>
+		        	<ul class="nmb_jj">
+			            <li style="position: absolute;">
+			             	<input type="text" style="width: 120px;" class="srkk"  id="startActiveTime" name="startActiveTime"  onfocus="WdatePicker({dateFmt:'yyyy-MM-dd',autoPickDate:true})" autocomplete="off" th:value="${#dates.format(startActiveTime, 'yyyy-MM-dd')}" placeholder="合同开始激活日期">
+			            </li>
+		          </ul>
+		        </td>
+		      </tr>
+		      <tr th:if="${startActiveTime!=null}">
+		        <td height="20"></td>
+		        <td></td>
+		      </tr>
+		      
+		      
+		       <tr valign="top" th:if="${activeTime!=null}">
+	  			<td align="right" width="70" style="line-height: 30px;font-weight: 700">合同激活日期:</td>
+	  	        <td>
+		        	<ul class="nmb_jj">
+			            <li style="position: absolute;">
+			            	<input type="text" style="width: 120px;" class="srkk"  id="activeTime" name="activeTime"  onfocus="WdatePicker({dateFmt:'yyyy-MM-dd',autoPickDate:true})" autocomplete="off" th:value="${#dates.format(activeTime, 'yyyy-MM-dd')}" placeholder="合同开始激活日期">
+			            </li>
+		          </ul>
+		        </td>
+		      </tr>
+		      <tr th:if="${activeTime!=null}">
+		        <td height="20"></td>
+		        <td></td>
+		      </tr>
+		      
+		      
+		      <tr valign="top">
+	  			<td align="right" width="70" style="line-height: 30px;font-weight: 700">购买月数量:</td>
+	  	        <td>
+		        	<ul class="nmb_jj">
+			            <li class="jian" id="2_reduce_num">-</li>
+			            <li>
+			              <input name="" id="2_service_num" type="text" value="1" class="srkk" style="width: 50px;">
+			            </li>
+			            <li class="jia" id="2_add_num">+</li>  
+		          </ul>
+		        </td>
+		      </tr>
+		      <tr>
+		        <td height="20"></td>
+		        <td></td>
+		      </tr>
+
+		      
+		      <tr>
+		        <td height="20"></td>
+		        <td></td>
+		      </tr>
+
+			   <tr valign="top">
+				   <td align="right" width="70" style="line-height: 30px;font-weight: 700">单价:</td>
+				   <td>
+					   <ul class="nmb_jj">
+						   <li>
+							   <input name="price" id="price" th:value="${price}" readonly type="text" value="0" class="srkk" style="width: 95px;"><i> 元</i>
+						   </li>
+					   </ul>
+				   </td>
+			   </tr>
+			   <tr>
+				   <td height="20"></td>
+				   <td></td>
+			   </tr>
+
+		      <tr valign="top">
+	  			<td align="right" width="70" style="line-height: 30px;font-weight: 700">总价:</td>
+	  	        <td>
+		        	<ul class="nmb_jj">
+			            <li>
+			              <input name="payPrice" id="payPrice" readonly type="text" value="0" class="srkk" style="width: 95px;"><i> 元</i>
+			            </li>
+		          </ul>
+		        </td>
+		      </tr>
+		   	 <tr>
+		        <td height="20"></td>
+		        <td></td>
+		      </tr>
+
+		      <tr>
+		        <td></td>
+		        <td><a style="margin-left: 20px;" class="ty_but ml20" href="javascript:#" onclick="save();">购  买</a></td>
+		      </tr>
+		    </tbody>
+	   	</table>
+	    
+	</div>
+<br/>
+<br/>
+	<div id="qrdive" style="display:none"><div id="qrcode" style="padding-left: 30px"></div><div style="padding-top: 10px"><h1 style="font-size: 20px;color:red;padding-left: 55px;">请使用微信扫一扫支付</h1> </div></div>
+
+	<br/>
+	<br/>
+
+<table class="tablelist">
+	<thead>
+	    <tr>
+	    	<th >订单号</th>
+	    	<th >服务包类型</th>
+	    	<th >服务包人数</th>
+	    	<th >开始激活日期</th>
+	    	<th >结束激活日期</th>
+	    	<th >购买月份</th>
+	    	<th >服务包总价</th>
+	    	<th >购买时间</th>
+	    </tr> 
+	</thead>
+	<tbody>
+		 <tr  th:each="item:${list}" >
+		 	<td th:text="${item.id}"></td>
+	    	<td  th:switch="${item.signType}">
+			   <span th:case="1" >服务包1</span>
+			   <span th:case="2" >服务包2</span>
+			   <span th:case="3" >服务包3</span>
+			   <span th:case="4" >服务包4</span>
+			   <span th:case="5" >服务包5</span>
+			</td>
+			<td th:text="${item.libService}"></td>
+			<td th:text="${item.startActiveTime!=null ? #calendars.format(item.startActiveTime,'yyyy-MM-dd') : ''}"></td>
+			<td th:text="${item.activeTime!=null ? #calendars.format(item.activeTime,'yyyy-MM-dd') : ''}"></td>
+	    	<td th:text="${item.buyMonth}"></td>
+	    	<td th:text="${item.price}"></td>
+	    	<td th:text="${item.createTime}"></td>
+	    </tr> 
+	</tbody>
+</table> 
+<br/>
+<br/>
+
+</div>
+
+</body>
+
+
+<script type="text/javascript">
+	$(function () {
+		
+		$("#1_reduce_num").click(function (){
+			if($("#1_service_num").val()<=0){
+				parent.layer.msg("服务人数量不能小于1喔",{icon:11});
+				$("#1_service_num").val(1);
+				return;
+			}
+			$("#1_service_num").val(parseInt($("#1_service_num").val())-1);
+
+			$("#payPrice").val(Number($("#price").val())*Number($("#1_service_num").val())*Number($("#2_service_num").val()));
+
+		});
+
+		$("#1_service_num").bind("input propertychange", function (event) {
+				$("#payPrice").val(Number($("#price").val())*Number($("#1_service_num").val())*Number($("#2_service_num").val()));
+		});
+
+		$("#2_service_num").bind("input propertychange", function (event) {
+				$("#payPrice").val(Number($("#price").val())*Number($("#1_service_num").val())*Number($("#2_service_num").val()));
+		});
+		
+		$("#1_add_num").click(function (){
+			$("#1_service_num").val(parseInt($("#1_service_num").val())+1);
+			$("#payPrice").val(Number($("#price").val())*Number($("#1_service_num").val())*Number($("#2_service_num").val()));
+		});
+		
+		$("#2_reduce_num").click(function (){
+			if($("#2_service_num").val()<=1){
+				parent.layer.msg("购买月数量不能小于1喔",{icon:11});
+				$("#2_service_num").val(1);
+				return;
+			}
+			$("#2_service_num").val(parseInt($("#2_service_num").val())-1);
+			$("#payPrice").val(Number($("#price").val())*Number($("#1_service_num").val())*Number($("#2_service_num").val()));
+		});
+		
+		$("#2_add_num").click(function (){
+			$("#2_service_num").val(Number($("#2_service_num").val())+1);
+			$("#payPrice").val(Number($("#price").val())*Number($("#1_service_num").val())*Number($("#2_service_num").val()));
+		});
+		
+	})
+	var islock=false;
+	function save(){
+		if($("#1_service_num").val()<=0){
+			parent.layer.msg("服务人数量不能小于1喔",{icon:11});
+			$("#1_service_num").val(0);
+			return;
+		}
+		if($("#2_service_num").val()<1){
+			parent.layer.msg("购买月数量不能小于1喔",{icon:11});
+			$("#2_service_num").val(1);
+			return;
+		}
+		if(islock){
+			parent.layer.msg("正在下单中,请勿重复提交...",{icon:2});
+		}
+		parent.layer.confirm("确定为此商户购买服务包?", {
+			icon: 4, btn: ['确定','关闭'],offset: '100px' //按钮
+		}, function(index){
+				islock=true;
+				var id=$("#id").val();
+				var signType=5;
+				var libService=$("#1_service_num").val();
+				var buyMonth=$("#2_service_num").val();
+				var startActiveTime=$("#startActiveTime").val();
+				var activeTime=$("#activeTime").val();
+				var price=$("#price").val();
+				var unitPrice=$("#unitPrice").val();
+				
+				var url="[[${sysUrl}]]/sys/fx/nativeOrder";
+				var params ={
+			        'id' : id,
+			        'priceId':$("#priceId").val(),
+			        'libService':libService,
+			        'buyMonth':buyMonth,
+			        'unitPrice':unitPrice,
+			        'price':price,
+			        'startActiveTime':startActiveTime,
+			        'activeTime':activeTime
+			    };
+				$.post(url,params,function(data){
+					console.log(data)
+					if(data.code == '999'){
+						parent.layer.close(index);
+						$("#libServiceAdd").hide();
+						$("#qrdive").show();
+						var qrcode = new QRCode(document.getElementById("qrcode"), {
+							text: data.data.nativeCodeUrl,
+							width: 256,
+							height: 256,
+							colorDark : "#000000",
+							colorLight : "#ffffff",
+							correctLevel : QRCode.CorrectLevel.H
+						});
+
+						$("#orderId").val(data.data.orderId);
+						//轮询是否支付成功
+						// parent.layer.msg("购买成功",{icon:1});
+						// parent.location.reload();
+						// parent.layer.close(parent.layer.getFrameIndex(window.name));
+						islock=false;
+					}else{
+						parent.layer.msg(data.msg,{icon:11});
+						islock=false;
+					}
+				});
+		});
+	}
+
+	$(document).ready(function(){
+		var timer = setInterval(function(){ajax_wx_pay_status(timer)},2000);
+	});
+	function ajax_wx_pay_status(timer) {
+		var url="[[${sysUrl}]]/sys/fx/checkOrderState";
+		if ($("#orderId").val() != 0) {
+			$.post(
+					url,
+					{orderId:$("#orderId").val()},
+					function (res) {
+						if (res.data.state == 1) { //订单状态为1表示支付成功
+							//此处可以进行相应业务代码的编写,例如支付成功提示,或者直接进行页面跳转.
+							clearInterval(timer);
+							parent.layer.msg("购买成功",{icon:1});
+							window.setTimeout(function(){
+								parent.location.reload();
+								parent.layer.close(parent.layer.getFrameIndex(window.name));
+							},2000);
+
+						}
+					},"JSON");
+		}
+	}
+	
+	
+</script>
+
+</html>

+ 1 - 1
src/main/resources/templates/sys/lib/libJoinAdd.html

@@ -68,7 +68,7 @@
 		<ul class="forminfo">
 			<li class="clearfix">
 				<label>图书馆名称:<b>*</b></label>
-				<input type="text" id="leagueName" class="dfinput fl" name="leagueName"  th:value="${ws.leagueName}"/>
+				<input onkeyup="this.value=this.value.replace(/\s+/g,'')" type="text" id="leagueName" class="dfinput fl" name="leagueName"  th:value="${ws.leagueName}"/>
 			</li>
 			<li class="clearfix">
 				<label>图书馆CODE:<b>*</b></label>

+ 1 - 0
src/main/resources/templates/sys/order/orderList.html

@@ -95,6 +95,7 @@
 					</td>
 					<td  th:switch="${item.get('order_type')}">
 					   <span th:case="4">会员卡支付酬金</span>
+					   <span th:case="14">商户续费服务包</span>
 					   <span th:case="7">图书馆借书首次酬金</span>
 					   <span th:case="8">图书馆借书普通酬金</span>
 					   <span th:case="*">其他</span>

+ 15 - 39
src/main/resources/templates/sys/sales/libSalesPriceAdd.html

@@ -48,38 +48,27 @@
 	</ul>
 </div>
 <div class="formbody">
-	<div class="formtitle"><span th:text="${salesPrice.id} ? '修改销售卡价格' :'新增销售卡价格'">新增图书</span></div>
+	<div class="formtitle"><span th:text="${salesPrice.id} ? '修改' :'新增'">新增图书</span></div>
 	<form id="submitFrom"   method="post" class="form-horizontal form-validate">
 		     <input type="hidden" name="id" th:if="${salesPrice.id}" th:value="${salesPrice.id}"/>
-		     <input type="hidden" name="libId"  th:value="${salesPrice.libId}"/>
+		     <input type="hidden" name="libId" id="libId"  th:value="${salesPrice.libId}"/>
+		     <input type="hidden" name="species"  th:value="${salesPrice.species}"/>
+		     <input type="hidden" name="type"  th:value="${salesPrice.type}"/>
+		     <input type="hidden" name="name"  th:value="${salesPrice.name}"/>
+		     <input type="hidden" name="discount"  th:value="${salesPrice.discount}"/>
 		<ul class="forminfo">
-			   <li class="clearfix" id="clearfix">
-				    <label>卡片种类:<b>*</b></label>
-					<div class="vocation" style="margin-right: 5px; width: 346px">
-						<select class="select1" name="species">
-						   		 <option th:each="sort:${species}" th:selected="${ salesPrice.species eq sort.code }"  th:value="${sort.code}">[[${sort.name}]]</option>
-						</select>
-					</div>
-			   </li>
-			   <li class="clearfix">
-				    <label>销售卡类型:<b>*</b></label>
-					<div class="vocation" style="margin-right: 5px; width: 346px">
-						<select class="select1" name="type">
-						   		 <option th:each="sort:${cardType}" th:selected="${salesPrice.type eq sort.code }"  th:value="${sort.code}">[[${sort.name}]]</option>
-						</select>
-					</div>
-			   </li>
+
 				<li class="clearfix">
-					<label>销售卡名称:<b>*</b></label>
-					<input type="text" id="name" class="dfinput fl" name="name"  th:value="${salesPrice.name}"/>
+					<label>最小人数:<b>*</b></label>
+					<input type="text" id="minCount" class="dfinput fl" name="minCount"  th:value="${salesPrice.minCount}"/>
 				</li>
 				<li class="clearfix">
-					<label>价格:<b>*</b></label>
-					<input type="text" id="price" class="dfinput fl" name="price"  th:value="${salesPrice.price}"/>
+					<label>最大人数:<b>*</b></label>
+					<input type="text" id="maxCount" class="dfinput fl" name="maxCount"  th:value="${salesPrice.maxCount}"/>
 				</li>
 				<li class="clearfix">
-					<label>折扣价格:<b>*</b></label>
-					<input type="text" id="discount" class="dfinput fl" name="discount"  th:value="${salesPrice.discount}"/>
+					<label>价格:<b>*</b></label>
+					<input type="text" id="price" class="dfinput fl" name="price"  th:value="${salesPrice.price}"/>
 				</li>
 				<li>
 					<label>&nbsp;</label>
@@ -103,13 +92,6 @@ $(function(){
 			},
 			price : {
 				required : true,
-				digits:true,
-				min:10
-			},
-			discount : {
-				required : true,
-				digits:true,
-				min:10
 			}
 		},
 		messages: {
@@ -117,14 +99,8 @@ $(function(){
 				required : "不能为空"
 			},
 			price : {
-				required : "不能为空",
-				digits : "只能输入整数"
-			},
-			discount : {
-				required : "不能为空",
-				digits : "只能输入整数"
+				required : "不能为空"
 			}
-			
 		},
 		errorPlacement : function(error, element) {
 				error.appendTo(element.parent()); 
@@ -143,7 +119,7 @@ function roleFrom(){
 				if(data.meta.success){
 					layer.msg("操作成功!",{icon:1});
 			    	setTimeout(function(){
-			    		window.location.href ='[[${sysUrl}]]/sys/sales/libSalesPriceList.html';
+			    		window.location.href ='[[${sysUrl}]]/sys/sales/libSalesPriceList.html?libId='+$("#libId").val();
 					},1000);
 				}else{
 					layer.msg(data.meta.message,{icon:11});

+ 9 - 36
src/main/resources/templates/sys/sales/libSalesPriceList.html

@@ -18,49 +18,27 @@
 </style>
 <body>
 <div class="place">
-	<span>位置:</span>
+	<span></span>
 	<ul class="placeul">
-		<li><a href="#">后台系统管理</a></li>
-		<li><a th:href="@{/sys/sales/libSalesPriceList.html}">总部销售卡价格配置</a></li>
+		<li></li>
+		<li></li>
 	</ul>
 </div>
 <div class="rightinfo">
-	<form id="seachform" th:action="@{/sys/sales/libSalesPriceList.html}" method="post">
 	<ul class="seachform">
-		<li>
-		<label>销售卡种类</label>
-					<select class="scinput" style="width: 100px;" name="EQ_species"   >
-					    <option value=""  th:selected="${ search.get('EQ_species') eq '' }"  >全部</option>
-						<option th:value="${sort.code}" th:each="sort:${species}" th:selected="${ search.get('EQ_type') eq sort.code }" >[[${sort.name}]]</option>
-					</select>
-		</li>
-		<li>
-		<label>销售卡类型</label>
-					<select class="scinput" style="width: 200px;" name="EQ_type"   >
-					    <option value=""  th:selected="${ search.get('EQ_type') eq '' }"  >全部</option>
-						<option th:value="${sort.code}" th:each="sort:${cardType}" th:selected="${ search.get('EQ_type') eq sort.code }" >[[${sort.name}]]</option>
-					</select>
-		</li>
-		<li>
-			<label>&nbsp;</label>
-			<input type="button" class="scbtn" value="查询" />
-		</li>
 		<li   >
 				<ul class="toolbar">
 					<a th:href="@{/sys/sales/libSalesPriceAdd.html}"><li class="click"><span><img th:src="@{/static/sys/images/t01.png}" /></span>新增</li></a>
 				</ul>
 		</li>
 	</ul>
-	</form>
 	<table class="tablelist">
 		<thead>
 		    <tr>
 		        <th style="width: 80px;">序号</th>
-		        <th>销售卡种类</th>
-		        <th>销售卡类型</th>
-		        <th>销售卡名称</th>
-		        <th>销售卡单价</th>
-		        <th>销售卡折扣</th>
+		        <th>最小人数</th>
+		        <th>最大人数</th>
+		        <th>价格</th>
 		        <th>添加时间</th>
 		        <th>操作</th>
 		    </tr>
@@ -68,15 +46,10 @@
 		<tbody>
 			<tr th:each="item:${list}" >
 				<td th:text="${itemStat.count}" ></td>
-					<td>
-				       <span th:each="sort:${species}" th:if="${sort.code eq item.species}" th:text="${sort.name}"></span>
-				    </td>
-					<td>
-				       <span th:each="sort:${cardType}" th:if="${sort.code eq item.type}" th:text="${sort.name}"></span>
-				    </td>
-					<td th:text="${item.name}" ></td>
+					<td th:text="${item.minCount}" ></td>
+					<td th:text="${item.maxCount}" ></td>
 					<td th:text="${item.price}" ></td>
-					<td th:text="${item.discount}" ></td>
+
 					<td  th:text="${#calendars.format(item.createTime,'yyyy-MM-dd HH:mm:ss')}" ></td>
 					<td >
 					    <a th:href="@{/sys/sales/libSalesPriceAdd.html(id=${item.id})}"  class="tablelink" >修改</a>