| @@ -47,13 +47,15 @@ | |||
| <version>5.2.4</version> | |||
| </dependency> | |||
| <!-- https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j --> | |||
| <!-- ocr --> | |||
| <dependency> | |||
| <groupId>net.sourceforge.tess4j</groupId> | |||
| <artifactId>tess4j</artifactId> | |||
| <version>4.5.2</version> | |||
| <groupId>com.iformall</groupId> | |||
| <artifactId>mallinkOcr</artifactId> | |||
| <version>1.0</version> | |||
| </dependency> | |||
| </dependencies> | |||
| <build> | |||
| @@ -105,4 +105,12 @@ public class WxActivityController extends BaseController { | |||
| return wxActivityService.sendToCampaign(id); | |||
| } | |||
| @ApiOperation("从宣传页下线") | |||
| @PostMapping("offLineCampaign") | |||
| @SystemControllerLog(description = "活动-更新状态") | |||
| public ResultData offLineCampaign(@RequestBody WxActivity wxActivity) { | |||
| logger.debug("[" + getIpAddr() + "] WxActivityController::updateStatus"); | |||
| return wxActivityService.offLineCampaign(wxActivity); | |||
| } | |||
| } | |||
| @@ -1,5 +1,5 @@ | |||
| INSERT INTO `mallink`.`wx_score_rules`(`id`, `tenant_id`, `type`, `scale`) | |||
| select CEILING(RAND()*90000000000+10000000000),`tenant_id`,4,`scale` from wx_score_rules where type = 2 and scale > 10; | |||
| --集团版手动处理,(集团版不存在这类数据,子集团数据与原集团规则相等) | |||
| --集团版手动处理,(集团版不存在这类数据,子集团生日倍率数据与原集团规则相等) | |||
| --目前集团版(1008-1020-----1028)(1026-1027-----1025) | |||
| @@ -0,0 +1,8 @@ | |||
| update wx_score_rules set rules = concat(SUBSTRING(rules,1,char_length(rules)-1), | |||
| ",{\"id\": 17, \"desc\": \"每日签到\", \"step\": 1, \"limit\": 1, \"score\": 0}", | |||
| ",{\"id\": 18, \"desc\": \"连续签到7天\", \"step\": 1, \"limit\": 1, \"score\": 0}", | |||
| ",{\"id\": 19, \"desc\": \"连续签到14天\", \"step\": 1, \"limit\": 1, \"score\": 0}", | |||
| ",{\"id\": 20, \"desc\": \"连续签到28天\", \"step\": 1, \"limit\": 1, \"score\": 0}", | |||
| RIGHT(rules,1)) where type = 2 | |||
| --type=2 积分规则,每日登陆去掉-- 缓存--缓存--缓存 | |||
| @@ -0,0 +1,24 @@ | |||
| CREATE TABLE `wx_merchant_ocr_model` ( | |||
| `id` bigint(20) NOT NULL, | |||
| `merchant_id` bigint(20) NOT NULL COMMENT '商户编号', | |||
| `ocr_model_id` bigint(20) NOT NULL COMMENT 'ocr模板编号', | |||
| `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | |||
| `tenant_id` varchar(5) DEFAULT NULL COMMENT '租户id', | |||
| `parent_tenant_id` varchar(5) DEFAULT NULL, | |||
| `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP, | |||
| PRIMARY KEY (`id`), | |||
| UNIQUE KEY `UNIQUE` (`merchant_id`) | |||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; | |||
| CREATE TABLE `wx_ocr_model` ( | |||
| `id` bigint(20) NOT NULL, | |||
| `lang_code` varchar(20) NOT NULL DEFAULT 'iformallLang' COMMENT '语言定义', | |||
| `font_name` varchar(20) NOT NULL COMMENT '字库名称', | |||
| `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||
| `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||
| `remark` text COMMENT '说明', | |||
| `status` tinyint(1) DEFAULT '0' COMMENT '0-有效 1-无效', | |||
| PRIMARY KEY (`id`), | |||
| UNIQUE KEY `UNIQUE` (`font_name`) | |||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; | |||
| @@ -16,6 +16,17 @@ | |||
| <groupId>com.iformall</groupId> | |||
| <artifactId>mallinkService</artifactId> | |||
| <version>1.0</version> | |||
| </dependency> <!-- ocr --> | |||
| <dependency> | |||
| <groupId>com.iformall</groupId> | |||
| <artifactId>mallinkOcr</artifactId> | |||
| <version>1.0</version> | |||
| </dependency> | |||
| <!-- ocr --> | |||
| <dependency> | |||
| <groupId>com.iformall</groupId> | |||
| <artifactId>mallinkOcr</artifactId> | |||
| <version>1.0</version> | |||
| </dependency> | |||
| </dependencies> | |||
| <build> | |||
| @@ -32,6 +32,9 @@ public class CApplication { | |||
| @Value("${fm.upload_dir}") | |||
| private String uploadDir; | |||
| @Value("${fm.ocr_data}") | |||
| private String ocrData; | |||
| @Bean | |||
| public boolean isFmException() { | |||
| @@ -1,20 +1,27 @@ | |||
| package com.iformall.controller; | |||
| import com.github.pagehelper.PageInfo; | |||
| import com.iformall.common.Result; | |||
| import com.iformall.common.ResultData; | |||
| import com.iformall.domain.po.WxActivity; | |||
| import com.iformall.domain.po.base.BaseEntity; | |||
| import com.iformall.enums.EnumActivityStatus; | |||
| import com.iformall.service.WxActivityService; | |||
| import com.iformall.utils.DateUtils; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiImplicitParam; | |||
| import io.swagger.annotations.ApiImplicitParams; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.web.bind.annotation.GetMapping; | |||
| import org.springframework.web.bind.annotation.ModelAttribute; | |||
| import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| import javax.servlet.http.HttpServletResponse; | |||
| import java.util.Date; | |||
| import java.util.HashMap; | |||
| import java.util.Map; | |||
| @@ -30,6 +37,38 @@ public class WxActivityController extends BaseController { | |||
| @Autowired | |||
| private WxActivityService wxActivityService; | |||
| @ApiOperation("分页列表接口") | |||
| @GetMapping("list") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), | |||
| @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) | |||
| public ResultData list(@ModelAttribute WxActivity wxActivity, Integer pageNum, Integer pageSize) { | |||
| logger.debug("[" + getIpAddr() + "] WxActivityController::list"); | |||
| if (null == wxActivity) wxActivity = new WxActivity(); | |||
| wxActivity.setStatus(EnumActivityStatus.INJECT_ONLINE.getCode()); | |||
| wxActivity.updateTenantInfo(getTenantInfo()); | |||
| wxActivity.setSortColumns(BaseEntity.SortField.ActivityStartTime_DESC,BaseEntity.SortField.Id_DESC); | |||
| final PageInfo<WxActivity> page = wxActivityService.listAsPage(wxActivity, pageNum, pageSize); | |||
| return new ResultData(page); | |||
| } | |||
| @ApiOperation("") | |||
| @GetMapping("listStatus") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), | |||
| @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) | |||
| public ResultData listStatus(@ModelAttribute WxActivity wxActivity) { | |||
| logger.debug("[" + getIpAddr() + "] WxActivityController::list"); | |||
| if (null == wxActivity) wxActivity = new WxActivity(); | |||
| wxActivity.setStatus(EnumActivityStatus.INJECT_ONLINE.getCode()); | |||
| wxActivity.updateTenantInfo(getTenantInfo()); | |||
| wxActivity.setSortColumns(BaseEntity.SortField.ActivityStartTime_DESC,BaseEntity.SortField.Id_DESC); | |||
| if(wxActivity.getStartDate() == null || wxActivity.getEndDate() == null){ | |||
| wxActivity.setStartDate(DateUtils.getFirstDayForCurrMonth()); | |||
| wxActivity.setEndDate(DateUtils.getLastDayForMonth(new Date())); | |||
| } | |||
| return wxActivityService.getListStatus(wxActivity); | |||
| } | |||
| @ApiOperation("查询活动状态") | |||
| @GetMapping("/queryStatus") | |||
| @@ -0,0 +1,189 @@ | |||
| package com.iformall.controller; | |||
| import com.github.pagehelper.PageInfo; | |||
| import com.iformall.common.ErrorCode; | |||
| import com.iformall.common.ResultData; | |||
| import com.iformall.domain.po.WxCUserBasicSign; | |||
| import com.iformall.domain.po.WxCreditHistory; | |||
| import com.iformall.enums.EnumScoreType; | |||
| import com.iformall.exception.MallinkException; | |||
| import com.iformall.service.WxCUserBasicSignService; | |||
| import com.iformall.utils.DateUtils; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiImplicitParam; | |||
| import io.swagger.annotations.ApiImplicitParams; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.web.bind.annotation.*; | |||
| import java.util.Date; | |||
| import java.util.Map; | |||
| @RestController | |||
| @RequestMapping("/api/userSign") | |||
| @Api(description = "签到接口") | |||
| public class WxCUserBasicSignController extends BaseController { | |||
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||
| @Autowired | |||
| private WxCUserBasicSignService wxCUserBasicSignService; | |||
| @ApiOperation("用户签到列表") | |||
| @GetMapping("list") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name="pageNum",value="页数",dataType="int", paramType = "query",required=true), | |||
| @ApiImplicitParam(name="pageSize",value="每页条数",dataType="int", paramType = "query",required=true)}) | |||
| public ResultData list(@ModelAttribute WxCUserBasicSign wxCUserBasicSign, Integer pageNum, Integer pageSize) { | |||
| logger.debug("[" + getIpAddr() + "] WxCUserBasicSignController::list"); | |||
| if (null == wxCUserBasicSign){ | |||
| wxCUserBasicSign = new WxCUserBasicSign(); | |||
| } | |||
| Long memberId; | |||
| try { | |||
| memberId = getMemberId(); | |||
| } catch (MallinkException me) { | |||
| return new ResultData(ErrorCode.getByCode(me.getErrorCode())); | |||
| } | |||
| // wxCUserBasicSign.updateTenantInfo(getTenantInfo()); | |||
| wxCUserBasicSign.setTenantId(getTenantInfo().getFinalTenantId()); | |||
| wxCUserBasicSign.setUserId(memberId); | |||
| final PageInfo<WxCUserBasicSign> page = wxCUserBasicSignService.listAsPage(wxCUserBasicSign, pageNum, pageSize); | |||
| return new ResultData(page); | |||
| } | |||
| @ApiOperation("") | |||
| @GetMapping("listStatus") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), | |||
| @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) | |||
| public ResultData listStatus(@ModelAttribute WxCUserBasicSign wxCUserBasicSign) { | |||
| logger.debug("[" + getIpAddr() + "] WxCUserBasicSignController::listStatus"); | |||
| if (null == wxCUserBasicSign){ | |||
| wxCUserBasicSign = new WxCUserBasicSign(); | |||
| } | |||
| Long memberId; | |||
| try { | |||
| memberId = getMemberId(); | |||
| } catch (MallinkException me) { | |||
| return new ResultData(ErrorCode.getByCode(me.getErrorCode())); | |||
| } | |||
| // wxCUserBasicSign.updateTenantInfo(getTenantInfo()); | |||
| wxCUserBasicSign.setTenantId(getTenantInfo().getFinalTenantId()); | |||
| wxCUserBasicSign.setUserId(memberId); | |||
| if(wxCUserBasicSign.getStartDate() == null || wxCUserBasicSign.getEndDate() == null){ | |||
| wxCUserBasicSign.setStartDate(DateUtils.getFirstDayForCurrMonth()); | |||
| wxCUserBasicSign.setEndDate(DateUtils.getLastDayForMonth(new Date())); | |||
| } | |||
| return wxCUserBasicSignService.getListStatus(wxCUserBasicSign); | |||
| } | |||
| @ApiOperation("签到") | |||
| @PostMapping("signIn") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "", value = "", dataType = "", paramType = "", required = true)}) | |||
| public ResultData signIn(@RequestBody WxCUserBasicSign wxCUserBasicSign) { | |||
| logger.debug("[" + getIpAddr() + "] WxCUserBasicSignController::signIn"); | |||
| if (null == wxCUserBasicSign){ | |||
| wxCUserBasicSign = new WxCUserBasicSign(); | |||
| } | |||
| Long memberId; | |||
| try { | |||
| memberId = getMemberId(); | |||
| } catch (MallinkException me) { | |||
| return new ResultData(ErrorCode.getByCode(me.getErrorCode())); | |||
| } | |||
| // wxCUserBasicSign.updateTenantInfo(getTenantInfo()); | |||
| wxCUserBasicSign.setTenantId(getTenantInfo().getFinalTenantId()); | |||
| wxCUserBasicSign.setUserId(memberId); | |||
| WxCUserBasicSign todaySign = wxCUserBasicSignService.getTodaySignIn(wxCUserBasicSign); | |||
| if(todaySign == null){ | |||
| try { | |||
| todaySign = wxCUserBasicSignService.signIn(wxCUserBasicSign); | |||
| }catch(Exception e){ | |||
| return new ResultData(ErrorCode.SYS_SERVER_ERROR); | |||
| } | |||
| if(todaySign == null){ | |||
| return new ResultData(ErrorCode.SYS_PARAMETER_ERROR,"type"); | |||
| } | |||
| return new ResultData(todaySign); | |||
| }else{ | |||
| return new ResultData(ErrorCode.MEM_IS_SIGNIN,todaySign); | |||
| } | |||
| } | |||
| @ApiOperation("签到状态") | |||
| @GetMapping("signInStatus") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "", value = "", dataType = "", paramType = "", required = true)}) | |||
| public ResultData signInStatus() { | |||
| logger.debug("[" + getIpAddr() + "] WxCUserBasicSignController::signIn"); | |||
| WxCUserBasicSign wxCUserBasicSign = new WxCUserBasicSign(); | |||
| Long memberId; | |||
| try { | |||
| memberId = getMemberId(); | |||
| } catch (MallinkException me) { | |||
| return new ResultData(ErrorCode.getByCode(me.getErrorCode())); | |||
| } | |||
| // wxCUserBasicSign.updateTenantInfo(getTenantInfo()); | |||
| wxCUserBasicSign.setTenantId(getTenantInfo().getFinalTenantId()); | |||
| wxCUserBasicSign.setUserId(memberId); | |||
| Map<String, Integer> map = wxCUserBasicSignService.getLastSignIn(wxCUserBasicSign); | |||
| return new ResultData(map); | |||
| } | |||
| @ApiOperation("签到领取") | |||
| @PostMapping("signInCredit") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "", value = "", dataType = "", paramType = "", required = true)}) | |||
| public ResultData signInCredit(@RequestBody WxCreditHistory wxCreditHistory) { | |||
| logger.debug("[" + getIpAddr() + "] WxCUserBasicSignController::signIn"); | |||
| if (null == wxCreditHistory){ | |||
| wxCreditHistory = new WxCreditHistory(); | |||
| } | |||
| Long memberId; | |||
| try { | |||
| memberId = getMemberId(); | |||
| } catch (MallinkException me) { | |||
| return new ResultData(ErrorCode.getByCode(me.getErrorCode())); | |||
| } | |||
| WxCUserBasicSign wxCUserBasicSign = new WxCUserBasicSign(); | |||
| wxCUserBasicSign.setTenantId(getFinalTenantId()); | |||
| wxCUserBasicSign.setUserId(memberId); | |||
| Map<String, Integer> map = wxCUserBasicSignService.getLastSignIn(wxCUserBasicSign); | |||
| int continueMonthSign = map.get("continueMonthSign");//本月连续签到天数 | |||
| int continueSign = map.get("continueSign");//连续签到天数 | |||
| int signInSevenDay = map.get("signInSevenDay");//7日连续奖励 | |||
| int signInFTDay = map.get("signInFTDay");//14日连续奖励 | |||
| int signInTEDay = map.get("signInTEDay");//28日连续奖励 | |||
| if(wxCreditHistory.getCreditType().equals(EnumScoreType.SIGN_IN_SEVENDAY.getCode())){ | |||
| if(continueSign >= 7 && signInSevenDay == 0){ | |||
| wxCUserBasicSignService.signInCreditHistory(wxCUserBasicSign,EnumScoreType.SIGN_IN_SEVENDAY); | |||
| return new ResultData(); | |||
| } | |||
| return new ResultData(ErrorCode.MEM_MONTH_IS_USED); | |||
| }else if(wxCreditHistory.getCreditType().equals(EnumScoreType.SIGN_IN_FTDAY.getCode())){ | |||
| if(continueSign >= 14 && signInFTDay == 0){ | |||
| wxCUserBasicSignService.signInCreditHistory(wxCUserBasicSign,EnumScoreType.SIGN_IN_FTDAY); | |||
| return new ResultData(); | |||
| } | |||
| return new ResultData(ErrorCode.MEM_MONTH_IS_USED); | |||
| }else if(wxCreditHistory.getCreditType().equals(EnumScoreType.SIGN_IN_TEDAY.getCode())){ | |||
| if(continueSign >= 28 && signInTEDay == 0){ | |||
| wxCUserBasicSignService.signInCreditHistory(wxCUserBasicSign,EnumScoreType.SIGN_IN_TEDAY); | |||
| return new ResultData(); | |||
| } | |||
| return new ResultData(ErrorCode.MEM_MONTH_IS_USED); | |||
| }else{ | |||
| return new ResultData(ErrorCode.SYS_PARAMETER_ERROR,"creditType"); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,63 @@ | |||
| package com.iformall.controller; | |||
| import com.iformall.common.ErrorCode; | |||
| import com.iformall.common.ResultData; | |||
| import com.iformall.domain.po.WxMerchantOcrModel; | |||
| import com.iformall.domain.po.WxOcrModel; | |||
| import com.iformall.domain.po.base.TenantEntity; | |||
| import com.iformall.ocr.FormallTess4j; | |||
| import com.iformall.service.WxOcrService; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiImplicitParam; | |||
| import io.swagger.annotations.ApiImplicitParams; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.web.bind.annotation.GetMapping; | |||
| import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| /** | |||
| * @author gongbiao | |||
| */ | |||
| @RestController | |||
| @RequestMapping("/api/wxOcr") | |||
| @Api(description = "ocr") | |||
| public class WxOcrController extends BaseController { | |||
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||
| @Autowired | |||
| private WxOcrService ocrService; | |||
| @Autowired | |||
| private String ocrData; | |||
| @ApiOperation("分析图片信息") | |||
| @GetMapping("/analyImage") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "merchantId", value = "商户编号", dataType = "Long", paramType = "query", required = true), | |||
| @ApiImplicitParam(name = "imageUrl", value = "小票图片url", dataType = "String", paramType = "query", required = true), | |||
| }) | |||
| public ResultData analyImage(Long merchantId,String imageUrl) { | |||
| TenantEntity tenantEntity = getTenantInfo(); | |||
| WxMerchantOcrModel MerchantModel = ocrService.getMerchantOcrModel(merchantId, tenantEntity.getTenantId(), tenantEntity.getParentTenantId()); | |||
| if (null == MerchantModel) { | |||
| return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(), "当前商户没有配置OCR模板"); | |||
| } | |||
| WxOcrModel ocrModel = ocrService.getOcrModelById(MerchantModel.getOcrModelId()); | |||
| if (null == ocrModel) { | |||
| return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(), "当前商户配置的OCR模板未查询到"); | |||
| } | |||
| String result; | |||
| try { | |||
| result = FormallTess4j.ocrNetImgFile(ocrData,imageUrl,ocrModel.getFontName()); | |||
| return new ResultData(result); | |||
| } catch (Exception e) { | |||
| logger.error("ocr识别失败。",e); | |||
| return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(), "ocr识别失败。"+e.getMessage()); | |||
| } | |||
| } | |||
| } | |||
| @@ -1014,7 +1014,7 @@ public class WxUserGrantController extends BaseController { | |||
| wxCUserBasicInfoService.updateQrCode(wxCUserBasicInfo); | |||
| } | |||
| } | |||
| RedisCacheUtils.cache(objectCommonRedisTemplate, key, qrCode, Constant.S_D_EXPIRE); | |||
| RedisCacheUtils.cache(objectCommonRedisTemplate, key, qrCode, 0); | |||
| } catch (Exception e) { | |||
| logger.error("getUserinfoQrCode error.",e); | |||
| @@ -160,6 +160,7 @@ fm: | |||
| deploy: 1 | |||
| open: true | |||
| upload_dir: /home/test/server/uploads/ | |||
| ocr_data: /home/test/server/ocr_data/ | |||
| logging: | |||
| level: | |||
| @@ -115,6 +115,7 @@ fm: | |||
| deploy: 3 | |||
| open: true | |||
| upload_dir: /root/uploads/ | |||
| ocr_data: /root/ocr_data/ | |||
| logging: | |||
| level: | |||
| @@ -93,6 +93,7 @@ fm: | |||
| deploy: 2 | |||
| open: true | |||
| upload_dir: /home/ec2-user/server/uploads/ | |||
| ocr_data: /home/ec2-user/server/ocr_data/ | |||
| logging: | |||
| level: | |||
| @@ -15,20 +15,27 @@ | |||
| <dependency> | |||
| <groupId>net.java.dev.jna</groupId> | |||
| <artifactId>jna</artifactId> | |||
| <version>4.1.0</version> | |||
| <version>5.3.1</version> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>net.sourceforge.tess4j</groupId> | |||
| <artifactId>tess4j</artifactId> | |||
| <version>3.4.0</version> | |||
| <version>4.4.0</version> | |||
| <exclusions> | |||
| <exclusion> | |||
| <groupId>com.sun.jna</groupId> | |||
| <artifactId>jna</artifactId> | |||
| </exclusion> | |||
| <artifactId>commons-io</artifactId> | |||
| <groupId>commons-io</groupId> | |||
| </exclusion> | |||
| <exclusion> | |||
| <artifactId>commons-logging</artifactId> | |||
| <groupId>commons-logging</groupId> | |||
| </exclusion> | |||
| <exclusion> | |||
| <artifactId>jna</artifactId> | |||
| <groupId>net.java.dev.jna</groupId> | |||
| </exclusion> | |||
| </exclusions> | |||
| </dependency> | |||
| </dependencies> | |||
| </project> | |||
| @@ -124,16 +124,16 @@ public class FormallTess4j { | |||
| } | |||
| } | |||
| public static String ocrLocalImgFile(String filePath,String dataPath) throws Exception { | |||
| File imageFile = new File(filePath); | |||
| String result = testDoOCR_File(imageFile,dataPath); | |||
| private static String ocrLocalImgFile(String languagePath,String filePath,String fontName) throws Exception { | |||
| File imageFile = new File(filePath,fontName); | |||
| String result = testDoOCR_File(languagePath,imageFile,fontName); | |||
| deletetempFile(imageFile); | |||
| return result; | |||
| } | |||
| public static String ocrNetImgFile(String fileUrl,String dataPath) throws Exception { | |||
| public static String ocrNetImgFile(String languagePath,String fileUrl,String fontName) throws Exception { | |||
| File imageFile = urlImgToFile(fileUrl); | |||
| String result = testDoOCR_File(imageFile,dataPath); | |||
| String result = testDoOCR_File(languagePath,imageFile,fontName); | |||
| deletetempFile(imageFile); | |||
| return result; | |||
| } | |||
| @@ -143,11 +143,11 @@ public class FormallTess4j { | |||
| * 根据图片文件进行识别 | |||
| * @throws Exception while processing image. | |||
| */ | |||
| private static String testDoOCR_File(File imageFile,String dataPath) throws Exception { | |||
| public static String testDoOCR_File(String languagePath,File imageFile,String fontName) throws Exception { | |||
| logger.info("doOCR on a jpg image"); | |||
| //set language | |||
| instance.setDatapath(dataPath); | |||
| instance.setLanguage("chi_sim"); | |||
| instance.setDatapath(languagePath); | |||
| instance.setLanguage(fontName); | |||
| String result = instance.doOCR(imageFile); | |||
| return result; | |||
| } | |||
| @@ -155,14 +155,13 @@ public class FormallTess4j { | |||
| public static void main(String[] args) { | |||
| try { | |||
| System.out.println(ocrNetImgFile("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.my0832.com%2Fattachments%2Fbbs%2F20140424%2F201442413083356803_740_1186.jpg&refer=http%3A%2F%2Fimg.my0832.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1613903848&t=985fc4c6c7b7ee82cb98f97ab5bf1459",testResourcesLanguagePath)); | |||
| System.out.println(ocrNetImgFile(testResourcesLanguagePath,"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.my0832.com%2Fattachments%2Fbbs%2F20140424%2F201442413083356803_740_1186.jpg&refer=http%3A%2F%2Fimg.my0832.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1613903848&t=985fc4c6c7b7ee82cb98f97ab5bf1459","test1")); | |||
| } catch (Exception e) { | |||
| // TODO Auto-generated catch block | |||
| e.printStackTrace(); | |||
| } | |||
| } | |||
| // | |||
| // /** | |||
| // * Test of doOCR method, of class Tesseract. | |||
| @@ -0,0 +1,134 @@ | |||
| package com.iformall.ocr; | |||
| import java.io.BufferedWriter; | |||
| import java.io.File; | |||
| import java.io.FileWriter; | |||
| import java.io.IOException; | |||
| import java.io.InputStreamReader; | |||
| import java.io.LineNumberReader; | |||
| /** | |||
| * 训练 | |||
| * @author iformall | |||
| */ | |||
| public class FormallTess4jTrain { | |||
| private static final String newFileFolder = "C:\\Users\\iformall\\Desktop\\newfile"; | |||
| private static final String huanhangstr = " \n"; | |||
| private static String getprefix(String lang,String fontName) { | |||
| String realFileName = lang+"."+fontName+".exp0"; | |||
| return realFileName; | |||
| } | |||
| private static String createBoxFile(String tifFileName,String lang,String fontName) { | |||
| String prefix = getprefix(lang,fontName); | |||
| String realFileName = prefix+".tif"; | |||
| if (tifFileName.equals(realFileName)) { | |||
| String cmdstr = "tesseract "+tifFileName+" "+prefix+" -l chi_sim batch.nochop makebox"; | |||
| return cmdstr; | |||
| //String result = executeLocalCmd(cmdstr, null); | |||
| //System.out.println("Done createBoxFile"+result); | |||
| }else { | |||
| return "文件必须是.tif"; | |||
| } | |||
| } | |||
| private static String createTranFile(String lang,String fontName) { | |||
| String prefix = getprefix(lang,fontName); | |||
| String realFileName = prefix+".tif"; | |||
| String trainCmdstr = "tesseract "+realFileName+" "+prefix+" nobatch box.train"; | |||
| return trainCmdstr; | |||
| } | |||
| private static String getBoxFont(String lang,String fontName) { | |||
| String prefix = getprefix(lang,fontName); | |||
| String extractorCmdstr = "unicharset_extractor "+prefix+".box"; | |||
| return extractorCmdstr; | |||
| } | |||
| /** | |||
| * 第六步,执行完成后生成以下几个文件加前缀 | |||
| * unicharset、inttemp、pffmtable、shapetable、normproto 添加这几个文件的前缀为fontName | |||
| * @param lang | |||
| * @param fontName | |||
| * @return | |||
| */ | |||
| private static String renameTrainFiles(String fontName) { | |||
| StringBuffer sb = new StringBuffer(); | |||
| String renCmdstr = "REN unicharset "+fontName+".unicharset"; | |||
| sb.append(renCmdstr).append(huanhangstr); | |||
| renCmdstr = "REN inttemp "+fontName+".inttemp"; | |||
| sb.append(renCmdstr).append(huanhangstr); | |||
| renCmdstr = "REN pffmtable "+fontName+".pffmtable"; | |||
| sb.append(renCmdstr).append(huanhangstr); | |||
| renCmdstr = "REN shapetable "+fontName+".shapetable"; | |||
| sb.append(renCmdstr).append(huanhangstr); | |||
| renCmdstr = "REN normproto "+fontName+".normproto"; | |||
| sb.append(renCmdstr).append(huanhangstr); | |||
| return sb.toString(); | |||
| } | |||
| /** | |||
| * 第七步:合并5个文件 | |||
| * @param lang | |||
| * @param fontName | |||
| * @return | |||
| */ | |||
| private static String mergeTrainFiles(String fontName) { | |||
| String mergeCmdstr = "combine_tessdata "+fontName+"."; | |||
| return mergeCmdstr; | |||
| } | |||
| public static String getTrainSteps(String lang,String fontName) { | |||
| StringBuffer sb = new StringBuffer("请进入到样本图片文件夹用doc命令执行.").append(huanhangstr); | |||
| sb.append("第一步,用jTessBoxEditor --> Tools --> Merge 多选图片,保存为tif格式 .命名格式为[lang].[fontName].exp0.tif. 命名:").append(lang).append(".").append(fontName).append(".exp0.tif ").append(huanhangstr); | |||
| sb.append("............ ").append(huanhangstr); | |||
| sb.append("第二步,用tif生成box ").append(huanhangstr); | |||
| sb.append(createBoxFile(lang+"."+fontName+".exp0.tif", lang, fontName)).append(huanhangstr); | |||
| sb.append("............ ").append(huanhangstr); | |||
| sb.append("第三步,用jTessBoxEditor 打开.box文件进行矫正 ").append(huanhangstr); | |||
| sb.append("............ ").append(huanhangstr); | |||
| sb.append("第四步:用box文件生成。tr文件 ").append(huanhangstr); | |||
| sb.append(createTranFile(lang,fontName)).append(huanhangstr); | |||
| sb.append("............ ").append(huanhangstr); | |||
| sb.append("第五步:提取box字符 ").append(huanhangstr); | |||
| sb.append(getBoxFont(lang,fontName)).append(huanhangstr); | |||
| sb.append("............ ").append(huanhangstr); | |||
| sb.append("@@@!!!!从此处开始,可以处理多个字库处理。如原来的字库现在做升级,需要把老的字库的。tif,.box,.tr文件重新命名也放到同目录文件夹, ").append(huanhangstr); | |||
| sb.append("............ ").append(huanhangstr); | |||
| sb.append("第六步:新建font_properties(没有.txt后缀), 把所有box对应的字体特征加进去。").append(huanhangstr); | |||
| sb.append("fontname为字体名称,保持和 图片集文件 .tif 和.box文件的前缀名一致 .<italic> 、<bold> 、<fixed> 、<serif>、 <fraktur>的取值为1或0,表示字体是否具有这些属性。 ").append(huanhangstr); | |||
| sb.append("如以下内容: ").append(huanhangstr); | |||
| sb.append("fontName1 0 0 0 0 0 ").append(huanhangstr); | |||
| sb.append("fontName2 0 1 0 0 0 ").append(huanhangstr); | |||
| sb.append("fontName3 1 1 0 0 0 ").append(huanhangstr); | |||
| sb.append("............ ").append(huanhangstr); | |||
| sb.append("第六步:批量执行系列命令。多个文件在后面累加。 ").append(huanhangstr); | |||
| String prefix = getprefix(lang,fontName); | |||
| String shapeCmdStr = "shapeclustering -F font_properties -U unicharset "+prefix+".tr [other .tr files...] "; | |||
| sb.append(shapeCmdStr).append(huanhangstr); | |||
| String mftraingCmdstr = "mftraining -F font_properties -U unicharset -O unicharset "+prefix+".tr [other .tr files...] "; | |||
| sb.append(mftraingCmdstr).append(huanhangstr); | |||
| String cntrainCmdstr = "cntraining "+prefix+".tr [other .tr files...] "; | |||
| sb.append(cntrainCmdstr).append(huanhangstr); | |||
| sb.append("............ ").append(huanhangstr); | |||
| sb.append("第七步,执行完成后生成以下几个文件加前缀: unicharset、inttemp、pffmtable、shapetable、normproto 添加这几个文件的前缀为[fontName] ").append(huanhangstr); | |||
| sb.append(renameTrainFiles(fontName)); | |||
| sb.append("............ ").append(huanhangstr); | |||
| sb.append("第七步:合并5个文件").append(huanhangstr); | |||
| sb.append(mergeTrainFiles(fontName)).append(huanhangstr); | |||
| sb.append("............ ").append(huanhangstr); | |||
| sb.append("第八步:将").append(fontName).append(".traineddata 文件拷贝到后端服务器ocr_data(项目配置fm.ocr_data)目录下。 .tif、。box、。tr文件也需要保留,后面如果这个字库有更新,需要用到这些文件。").append(huanhangstr); | |||
| return sb.toString(); | |||
| } | |||
| } | |||
| @@ -1,3 +1,14 @@ | |||
| https://www.cnblogs.com/wj-1314/p/9454656.html | |||
| https://www.cnblogs.com/pejsidney/p/9487881.html | |||
| https://www.cnblogs.com/pejsidney/p/9487881.html | |||
| https://digi.bib.uni-mannheim.de/tesseract/ | |||
| https://blog.csdn.net/qq_40147863/article/details/82290015 | |||
| https://blog.csdn.net/boonya/article/details/81325997 | |||
| 合并字库 https://www.cnblogs.com/c2soft/articles/10415236.html | |||
| 完整教程 https://www.cnblogs.com/wpcnblog/p/12850590.html | |||
| @@ -35,14 +35,6 @@ | |||
| <artifactId>mybatis-multi-tenancy</artifactId> | |||
| <version>1.0</version> | |||
| </dependency> | |||
| <!-- ocr --> | |||
| <dependency> | |||
| <groupId>com.iformall</groupId> | |||
| <artifactId>mallinkOcr</artifactId> | |||
| <version>1.0</version> | |||
| </dependency> | |||
| </dependencies> | |||
| </project> | |||
| @@ -396,6 +396,8 @@ public enum ErrorCode{ | |||
| CREDIT_NOT_ENOUGH(13101, "积分不够扣减值"), | |||
| USER_NOT_MEMBER(13102, "该用户不是小程序会员"), | |||
| OUT_OF_CREDIT(13103, "超出最大积分"), | |||
| MEM_IS_SIGNIN(13104, "该用户已签到"), | |||
| MEM_MONTH_IS_USED(13105, "该用户本月已领取或未到领取条件"), | |||
| /** | |||
| @@ -538,6 +540,7 @@ public enum ErrorCode{ | |||
| ACTIVITY_TIME_ERROR(30005, "活动报名结束时间不能大于活动结束时间"), | |||
| ACTIVITY_WAIT_CONFIRMED(30006, "您报名的活动还在审核中"), | |||
| ACTIVITY_EXPIRED(30007, "您报名的活动已过期"), | |||
| ACTIVITY_SEND_ERROR_NOONLINE(30008, "活动投放到宣传页失败,活动未上线!"), | |||
| /** | |||
| * 文件上传 | |||
| @@ -76,6 +76,13 @@ public class BaseMyBatisConfiguration { | |||
| basicInfoSharding.setRule(EnumShardingRule.HASH.getCode()); | |||
| shardingList.add(basicInfoSharding); | |||
| ShardingSphere basicSignSharding = new ShardingSphere(); | |||
| basicSignSharding.setColumn("tenant_id"); | |||
| basicSignSharding.setTableName("wx_c_user_basic_sign"); | |||
| basicSignSharding.setCount(100); | |||
| basicSignSharding.setRule(EnumShardingRule.HASH.getCode()); | |||
| shardingList.add(basicSignSharding); | |||
| ShardingSphere wxbasicChildSharding = new ShardingSphere(); | |||
| wxbasicChildSharding.setColumn("tenant_id"); | |||
| wxbasicChildSharding.setTableName("wx_c_user_basic_child"); | |||
| @@ -72,11 +72,11 @@ public class WxActivity extends TenantEntity { | |||
| @TableField(exist = false) | |||
| @io.swagger.annotations.ApiModelProperty(value = "开始时间", name = "starttime") | |||
| private Date starttime; | |||
| private Date startDate; | |||
| @TableField(exist = false) | |||
| @io.swagger.annotations.ApiModelProperty(value = "结束时间", name = "endtime") | |||
| private Date endtime; | |||
| private Date endDate; | |||
| @TableField(exist = false) | |||
| @@ -0,0 +1,67 @@ | |||
| package com.iformall.domain.po; | |||
| import com.baomidou.mybatisplus.annotation.TableField; | |||
| import com.baomidou.mybatisplus.annotation.TableName; | |||
| import com.iformall.domain.po.base.TenantEntity; | |||
| import lombok.Data; | |||
| import lombok.EqualsAndHashCode; | |||
| import lombok.ToString; | |||
| import java.util.Date; | |||
| @TableName(value = "wx_c_user_basic_sign") | |||
| @Data | |||
| @ToString(callSuper = true) | |||
| @EqualsAndHashCode(callSuper = true) | |||
| public class WxCUserBasicSign extends TenantEntity { | |||
| @TableField(exist = false) | |||
| public static final Integer SIGNIN_TYPE = 1; | |||
| protected Long id; | |||
| @io.swagger.annotations.ApiModelProperty(value="userId",name="userId") | |||
| private Long userId; | |||
| @io.swagger.annotations.ApiModelProperty(value="1:签到",name="type") | |||
| private Integer type; | |||
| @io.swagger.annotations.ApiModelProperty(value="签到时间",name="signinDate") | |||
| private Date signinDate; | |||
| @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createDate") | |||
| private Date createDate; | |||
| @io.swagger.annotations.ApiModelProperty(value="修改时间",name="updateDate") | |||
| private Date updateDate; | |||
| @io.swagger.annotations.ApiModelProperty(value="截止当前签到时间当月连续签到天数",name="continueMonthSign") | |||
| private Integer continueMonthSign; | |||
| @io.swagger.annotations.ApiModelProperty(value="截止当前签到时间当月累计签到天数",name="countMonthSign") | |||
| private Integer countMonthSign; | |||
| @io.swagger.annotations.ApiModelProperty(value="截止当前签到时间当年连续签到天数",name="continueYearSign") | |||
| private Integer continueYearSign; | |||
| @io.swagger.annotations.ApiModelProperty(value="截止当前签到时间当年累计签到天数",name="countYearSign") | |||
| private Integer countYearSign; | |||
| @io.swagger.annotations.ApiModelProperty(value="截止当前签到时间连续签到天数",name="continueSign") | |||
| private Integer continueSign; | |||
| @io.swagger.annotations.ApiModelProperty(value="截止当前签到时间累计签到天数",name="countSign") | |||
| private Integer countSign; | |||
| @io.swagger.annotations.ApiModelProperty(value="备注",name="mark") | |||
| private String mark; | |||
| @TableField(exist = false) | |||
| private Date startDate; | |||
| @TableField(exist = false) | |||
| private Date endDate; | |||
| @TableField(exist = false) | |||
| private Integer begin; | |||
| @TableField(exist = false) | |||
| private Integer limit; | |||
| } | |||
| @@ -0,0 +1,25 @@ | |||
| package com.iformall.domain.po; | |||
| import com.baomidou.mybatisplus.annotation.TableName; | |||
| import com.iformall.domain.po.base.TenantEntity; | |||
| import lombok.Data; | |||
| import lombok.EqualsAndHashCode; | |||
| import java.util.Date; | |||
| @TableName(value = "wx_merchant_ocr_model") | |||
| @Data | |||
| @EqualsAndHashCode(callSuper = true) | |||
| public class WxMerchantOcrModel extends TenantEntity { | |||
| private static final long serialVersionUID = 1L; | |||
| protected Long id; | |||
| @io.swagger.annotations.ApiModelProperty(value="商户编号",name="merchantId") | |||
| private Long merchantId; | |||
| @io.swagger.annotations.ApiModelProperty(value="ocr模板编号",name="ocrModelId") | |||
| private Long ocrModelId; | |||
| @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createTime") | |||
| private Date createTime; | |||
| @io.swagger.annotations.ApiModelProperty(value="创建时间",name="updateTime") | |||
| private Date updateTime; | |||
| } | |||
| @@ -0,0 +1,28 @@ | |||
| package com.iformall.domain.po; | |||
| import com.baomidou.mybatisplus.annotation.TableName; | |||
| import com.iformall.domain.po.base.BaseEntity; | |||
| import lombok.Data; | |||
| import lombok.EqualsAndHashCode; | |||
| import java.util.Date; | |||
| @TableName(value = "wx_ocr_model") | |||
| @Data | |||
| @EqualsAndHashCode(callSuper = true) | |||
| public class WxOcrModel extends BaseEntity { | |||
| private static final long serialVersionUID = 1L; | |||
| protected Long id; | |||
| @io.swagger.annotations.ApiModelProperty(value="语言定义,默认iformallLang",name="langCode") | |||
| private String langCode; | |||
| @io.swagger.annotations.ApiModelProperty(value="字库名称",name="fontName") | |||
| private String fontName; | |||
| @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createTime") | |||
| private Date createTime; | |||
| @io.swagger.annotations.ApiModelProperty(value="更新时间",name="updateTime") | |||
| private Date updateTime; | |||
| @io.swagger.annotations.ApiModelProperty(value="备注",name="remark") | |||
| private String remark; | |||
| @io.swagger.annotations.ApiModelProperty(value="0-有效 1-无效",name="status") | |||
| private Integer status; | |||
| } | |||
| @@ -48,7 +48,6 @@ public class WxScoreRules extends BaseTenantEntity { | |||
| " {\"businessId\":6,\"limit\":0,\"step\":1,\"score\":0 ,\"desc\":\"线上交易1元\"}" + | |||
| "]}," + | |||
| "{\"id\":3,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"绑定车牌1个\"}," + | |||
| "{\"id\":5,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"授权个人信息\"}," + | |||
| "{\"id\":6,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"授权手机号\"}," + | |||
| "{\"id\":7,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"编辑个人信息\"}" + | |||
| "]"; | |||
| @@ -56,7 +55,7 @@ public class WxScoreRules extends BaseTenantEntity { | |||
| @TableField(exist = false) | |||
| private static final String creditDefaultRules = | |||
| "[" + | |||
| "{\"id\":1,\"limit\":0,\"step\":1,\"score\":0 ,\"desc\":\"每日登陆\"}," + | |||
| // "{\"id\":1,\"limit\":0,\"step\":1,\"score\":0 ,\"desc\":\"每日登陆\"}," + | |||
| "{\"id\":2,\"childs\":[" + | |||
| " {\"businessId\":1,\"limit\":0,\"step\":1,\"score\":0 ,\"desc\":\"线上交易1元\"}," + | |||
| " {\"businessId\":2,\"limit\":0,\"step\":1,\"score\":0 ,\"desc\":\"线上交易1元\"}," + | |||
| @@ -71,10 +70,12 @@ public class WxScoreRules extends BaseTenantEntity { | |||
| " {\"businessId\":6,\"limit\":0,\"step\":1,\"score\":0 ,\"desc\":\"线上交易1元\"}" + | |||
| "]}," + | |||
| "{\"id\":3,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"绑定车牌1个\"}," + | |||
| "{\"id\":5,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"授权个人信息\"}," + | |||
| "{\"id\":6,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"授权手机号\"}," + | |||
| "{\"id\":7,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"编辑个人信息\"}," + | |||
| "{\"id\":8,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"编辑个人信息\"}" + | |||
| "{\"id\": 17, \"desc\": \"每日签到\", \"step\": 1, \"limit\": 1, \"score\": 0},"+ | |||
| "{\"id\": 18, \"desc\": \"连续签到7天\", \"step\": 1, \"limit\": 1, \"score\": 0},"+ | |||
| "{\"id\": 19, \"desc\": \"连续签到14天\", \"step\": 1, \"limit\": 1, \"score\": 0},"+ | |||
| "{\"id\": 20, \"desc\": \"连续签到28天\", \"step\": 1, \"limit\": 1, \"score\": 0},"+ | |||
| "]"; | |||
| @TableField(exist = false) | |||
| @@ -205,6 +205,10 @@ public class BaseEntity implements Serializable { | |||
| ReportDate_ASC("`report_date` ASC"), | |||
| ReportDate_DESC("`report_date` DESC"), | |||
| ActivityStartTime_ASC("`activity_start_time` ASC"), | |||
| ActivityStartTime_DESC("`activity_start_time` DESC"), | |||
| ; | |||
| private String value; | |||
| @@ -8,7 +8,8 @@ public enum EnumActivityStatus { | |||
| STATUS_THROW_IN(0, "已保存"), | |||
| STATUS_TAKE_OFFF(1, "已下线"), | |||
| INJECT_CAMPAIGN(2, "已投放"),; | |||
| INJECT_CAMPAIGN(2, "已投放"), | |||
| INJECT_ONLINE(3, "已上线"),; | |||
| public static EnumActivityStatus getEnum(Integer code) { | |||
| for (EnumActivityStatus value : values()) { | |||
| @@ -20,7 +20,12 @@ public enum EnumScoreType { | |||
| ACTIVITY_JOIN(13, "活动报名"), | |||
| CLEAN_CREDIT(14, "积分清零计划"), | |||
| GAME_LES_CREDIT(15, "游戏消耗积分"), | |||
| GAME_ADD_CREDIT(16, "游戏奖励积分"),; | |||
| GAME_ADD_CREDIT(16, "游戏奖励积分"), | |||
| SIGN_IN_DAY(17, "每日签到"), | |||
| SIGN_IN_SEVENDAY(18, "连续签到7天"), | |||
| SIGN_IN_FTDAY(19, "连续签到14天"), | |||
| SIGN_IN_TEDAY(20, "连续签到28天"),; | |||
| public static EnumScoreType getEnum(Integer code) { | |||
| for (EnumScoreType value : values()) { | |||
| @@ -0,0 +1,13 @@ | |||
| package com.iformall.mapper; | |||
| import com.iformall.common.CommonMapper; | |||
| import com.iformall.domain.po.WxCUserBasicSign; | |||
| import java.util.List; | |||
| public interface WxCUserBasicSignMapper extends CommonMapper<WxCUserBasicSign, Long> { | |||
| List<WxCUserBasicSign> findList(WxCUserBasicSign record); | |||
| WxCUserBasicSign getLastSignIn(WxCUserBasicSign record); | |||
| } | |||
| @@ -41,4 +41,6 @@ public interface WxCreditHistoryMapper extends CommonMapper<WxCreditHistory, Lon | |||
| Integer getLesCreditSummary(WxCreditHistory wxCreditHistory); | |||
| List<MerchantCreditRankingVo> merchantCreditRanking(WxCreditHistory record); | |||
| int monthCount(WxCreditHistory record); | |||
| } | |||
| @@ -0,0 +1,14 @@ | |||
| package com.iformall.mapper; | |||
| import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |||
| import com.iformall.domain.po.WxMerchantOcrModel; | |||
| import java.util.List; | |||
| import org.apache.ibatis.annotations.Mapper; | |||
| @Mapper | |||
| public interface WxMerchantOcrModelMapper extends BaseMapper<WxMerchantOcrModel> { | |||
| List<WxMerchantOcrModel> findList(WxMerchantOcrModel merchantOcrModel); | |||
| } | |||
| @@ -0,0 +1,14 @@ | |||
| package com.iformall.mapper; | |||
| import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |||
| import com.iformall.domain.po.WxOcrModel; | |||
| import java.util.List; | |||
| import org.apache.ibatis.annotations.Mapper; | |||
| @Mapper | |||
| public interface WxOcrModelMapper extends BaseMapper<WxOcrModel> { | |||
| List<WxOcrModel> findList(WxOcrModel ocrModel); | |||
| } | |||
| @@ -46,4 +46,7 @@ public interface WxActivityService { | |||
| Integer queryStatus(Long id, Long userId); | |||
| ResultData offLineCampaign(WxActivity wxActivity); | |||
| ResultData getListStatus(WxActivity wxActivity); | |||
| } | |||
| @@ -0,0 +1,31 @@ | |||
| package com.iformall.service; | |||
| import com.github.pagehelper.PageInfo; | |||
| import com.iformall.common.ResultData; | |||
| import com.iformall.domain.po.WxCUserBasicSign; | |||
| import com.iformall.enums.EnumScoreType; | |||
| import java.util.Map; | |||
| public interface WxCUserBasicSignService { | |||
| /** | |||
| * 根据实体查询分页列表 | |||
| * | |||
| * @param record | |||
| * @param pageIndex | |||
| * @param pageSize | |||
| * @return | |||
| */ | |||
| PageInfo<WxCUserBasicSign> listAsPage(WxCUserBasicSign record, Integer pageIndex, Integer pageSize); | |||
| WxCUserBasicSign signIn(WxCUserBasicSign record); | |||
| WxCUserBasicSign getTodaySignIn(WxCUserBasicSign record); | |||
| Map<String,Integer> getLastSignIn(WxCUserBasicSign record); | |||
| void signInCreditHistory(WxCUserBasicSign record, EnumScoreType enumScoreType); | |||
| ResultData getListStatus(WxCUserBasicSign wxCUserBasicSign); | |||
| } | |||
| @@ -85,4 +85,5 @@ public interface WxCreditHistoryService { | |||
| Integer getLesCreditSummary(WxCreditHistory wxCreditHistory); | |||
| PageInfo<MerchantCreditRankingVo> listAsPageMcrv(WxCreditHistory record, Integer pageIndex, Integer pageSize); | |||
| } | |||
| @@ -0,0 +1,30 @@ | |||
| package com.iformall.service; | |||
| import com.github.pagehelper.PageInfo; | |||
| import com.iformall.common.ResultData; | |||
| import com.iformall.domain.po.WxActivity; | |||
| import com.iformall.domain.po.WxMerchantOcrModel; | |||
| import com.iformall.domain.po.WxOcrModel; | |||
| import com.iformall.enums.EnumPayWay; | |||
| import java.util.List; | |||
| import javax.servlet.http.HttpServletResponse; | |||
| /** | |||
| * @author gongbiao | |||
| */ | |||
| public interface WxOcrService { | |||
| PageInfo<WxOcrModel> listOcrModelAsPage(WxOcrModel record, Integer pageIndex, Integer pageSize); | |||
| WxOcrModel getOcrModelById(Long id); | |||
| ResultData saveOrUpdateOcrModel(WxOcrModel record); | |||
| WxMerchantOcrModel getMerchantOcrModel(Long merchantId,String tenantId,String parentTenantId); | |||
| ResultData saveOrUpdateMerchantOcrModel(WxMerchantOcrModel record); | |||
| ResultData deleteMerchantOcrModel(Long id); | |||
| } | |||
| @@ -17,6 +17,7 @@ import com.iformall.mapper.WxActivityMapper; | |||
| import com.iformall.mapper.WxCampaignMapper; | |||
| import com.iformall.service.WxActivityService; | |||
| import com.iformall.service.WxCampaignService; | |||
| import com.iformall.utils.DateUtils; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| @@ -30,7 +31,7 @@ import java.io.ByteArrayInputStream; | |||
| import java.io.InputStream; | |||
| import java.io.UnsupportedEncodingException; | |||
| import java.net.URLDecoder; | |||
| import java.util.Date; | |||
| import java.util.*; | |||
| /** | |||
| * @author gongbiao | |||
| @@ -121,14 +122,20 @@ public class WxActivityServiceImpl implements WxActivityService { | |||
| if (activity == null) { | |||
| return new ResultData(ErrorCode.SYS_PARAMETER_ERROR); | |||
| } | |||
| if (wxActivity.getStatus().equals(EnumActivityStatus.INJECT_ONLINE.getCode()) | |||
| && activity.getEndTime().before(new Date())) { | |||
| return new ResultData(ErrorCode.ACTIVITY_JOIN_TIME_END); | |||
| } | |||
| wxActivity.setUpdateTime(new Date()); | |||
| wxActivityMapper.updateById(wxActivity); | |||
| if (wxActivity.getStatus().equals(EnumActivityStatus.STATUS_TAKE_OFFF.getCode())) { | |||
| WxCampaign campaign = new WxCampaign(); | |||
| campaign.setProduceId(wxActivity.getId()); | |||
| WxCampaign wxCampaign = wxCampaignMapper.selectOne(new QueryWrapper(campaign)); | |||
| wxCampaign.setStatus(EnumCampaignStatus.STATUS_TAKE_OFFF.getCode()); | |||
| wxCampaignMapper.updateById(wxCampaign); | |||
| if(wxCampaign != null){ | |||
| wxCampaign.setStatus(EnumCampaignStatus.STATUS_TAKE_OFFF.getCode()); | |||
| wxCampaignMapper.updateById(wxCampaign); | |||
| } | |||
| } | |||
| return new ResultData(Result.SUCCESS, "操作成功"); | |||
| } | |||
| @@ -172,6 +179,9 @@ public class WxActivityServiceImpl implements WxActivityService { | |||
| if (wxActivity.getEndTime().before(new Date())) { | |||
| return new ResultData(ErrorCode.ACTIVITY_JOIN_TIME_END); | |||
| } | |||
| if(!wxActivity.getStatus().equals(EnumActivityStatus.INJECT_ONLINE.getCode())){ | |||
| return new ResultData(ErrorCode.ACTIVITY_SEND_ERROR_NOONLINE); | |||
| } | |||
| wxActivity.setStatus(EnumActivityStatus.INJECT_CAMPAIGN.getCode()); | |||
| wxActivity.setUpdateTime(new Date()); | |||
| wxActivityMapper.updateById(wxActivity); | |||
| @@ -233,5 +243,56 @@ public class WxActivityServiceImpl implements WxActivityService { | |||
| return EnumActivityEnrollStatus.NORMAL.getCode(); | |||
| } | |||
| @Override | |||
| public ResultData offLineCampaign(WxActivity wxActivity) { | |||
| WxActivity activity = wxActivityMapper.selectById(wxActivity.getId()); | |||
| if (activity == null) { | |||
| return new ResultData(ErrorCode.SYS_PARAMETER_ERROR); | |||
| } | |||
| activity.setStatus(EnumActivityStatus.INJECT_ONLINE.getCode()); | |||
| activity.setUpdateTime(new Date()); | |||
| wxActivityMapper.updateById(activity); | |||
| if (wxActivity.getStatus().equals(EnumActivityStatus.STATUS_TAKE_OFFF.getCode())) { | |||
| WxCampaign campaign = new WxCampaign(); | |||
| campaign.setProduceId(wxActivity.getId()); | |||
| WxCampaign wxCampaign = wxCampaignMapper.selectOne(new QueryWrapper(campaign)); | |||
| wxCampaign.setStatus(EnumCampaignStatus.STATUS_TAKE_OFFF.getCode()); | |||
| wxCampaignMapper.updateById(wxCampaign); | |||
| } | |||
| return new ResultData(Result.SUCCESS, "操作成功"); | |||
| } | |||
| @Override | |||
| public ResultData getListStatus(WxActivity wxActivity) { | |||
| List list = new ArrayList(); | |||
| List<WxActivity> activityList = wxActivityMapper.findList(wxActivity); | |||
| if(activityList != null){ | |||
| for (WxActivity activity:activityList) { | |||
| Date start = activity.getActivityStartTime(); | |||
| Date end = activity.getActivityEndTime(); | |||
| Calendar dd = Calendar.getInstance(); | |||
| dd.setTime(start); | |||
| while (start.getTime() < end.getTime()) { | |||
| Map map = new HashMap<>(); | |||
| map.put("yyyy", DateUtils.getYear(start)); | |||
| map.put("mm", DateUtils.getMonth(start)); | |||
| map.put("dd", DateUtils.getMonthOfDate(start)); | |||
| list.add(map); | |||
| // 天数加上1 | |||
| dd.add(Calendar.DAY_OF_MONTH, 1); | |||
| start = dd.getTime(); | |||
| } | |||
| } | |||
| } | |||
| if(list.size() > 0){ | |||
| HashSet h = new HashSet(list); | |||
| list.clear(); | |||
| list.addAll(h); | |||
| } | |||
| return new ResultData(list); | |||
| } | |||
| } | |||
| @@ -0,0 +1,243 @@ | |||
| package com.iformall.service.impl; | |||
| import com.github.pagehelper.PageHelper; | |||
| import com.github.pagehelper.PageInfo; | |||
| import com.iformall.common.IdWorker; | |||
| import com.iformall.common.ResultData; | |||
| import com.iformall.domain.po.WxCUserBasicSign; | |||
| import com.iformall.domain.po.WxCreditHistory; | |||
| import com.iformall.enums.EnumScoreType; | |||
| import com.iformall.enums.EnumUserType; | |||
| import com.iformall.mapper.WxCUserBasicSignMapper; | |||
| import com.iformall.mapper.WxCreditHistoryMapper; | |||
| import com.iformall.service.WxCUserBasicSignService; | |||
| import com.iformall.service.WxCreditHistoryService; | |||
| import com.iformall.utils.DateUtils; | |||
| import lombok.extern.slf4j.Slf4j; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.stereotype.Service; | |||
| import org.springframework.transaction.annotation.Transactional; | |||
| import java.text.DateFormat; | |||
| import java.text.SimpleDateFormat; | |||
| import java.util.*; | |||
| import static java.util.Calendar.DAY_OF_MONTH; | |||
| @Service | |||
| @Slf4j | |||
| public class WxCUserBasicSignServiceImpl implements WxCUserBasicSignService { | |||
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||
| @Autowired | |||
| WxCUserBasicSignMapper wxCUserBasicSignMapper; | |||
| @Autowired | |||
| WxCreditHistoryService wxCreditHistoryService; | |||
| @Autowired | |||
| WxCreditHistoryMapper wxCreditHistoryMapper; | |||
| @Override | |||
| public PageInfo<WxCUserBasicSign> listAsPage(WxCUserBasicSign record, Integer pageIndex, Integer pageSize) { | |||
| return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCUserBasicSignMapper.findList(record)); | |||
| } | |||
| @Transactional(rollbackFor = {Exception.class}) | |||
| @Override | |||
| public WxCUserBasicSign signIn(WxCUserBasicSign record) { | |||
| if(record.getType() == null){ | |||
| record.setType(WxCUserBasicSign.SIGNIN_TYPE); | |||
| } | |||
| final IdWorker idWorker = IdWorker.get(); | |||
| record.setId(idWorker.nextId()); | |||
| Date today = new Date(); | |||
| record.setCreateDate(today); | |||
| record.setUpdateDate(today); | |||
| if(record.getType().equals(WxCUserBasicSign.SIGNIN_TYPE)){ | |||
| record.setSigninDate(DateUtils.getDateZero(today)); | |||
| WxCUserBasicSign lastSignIn = wxCUserBasicSignMapper.getLastSignIn(record); | |||
| if(lastSignIn == null){ | |||
| record.setContinueMonthSign(1); | |||
| record.setCountMonthSign(1); | |||
| record.setContinueYearSign(1); | |||
| record.setCountYearSign(1); | |||
| record.setContinueSign(1); | |||
| record.setCountSign(1); | |||
| wxCUserBasicSignMapper.insert(record); | |||
| }else{ | |||
| long daysL = DateUtils.startToEnd(lastSignIn.getSigninDate(), today); | |||
| int daysI = new Long(daysL).intValue(); | |||
| if(daysI == 0){ | |||
| return lastSignIn; | |||
| } | |||
| record.setCountSign(lastSignIn.getCountSign() + 1); | |||
| if(daysI == 1){ | |||
| record.setContinueSign(lastSignIn.getContinueSign() + 1); | |||
| }else{ | |||
| record.setContinueSign(1); | |||
| } | |||
| if(DateUtils.getYear(today) == DateUtils.getYear(lastSignIn.getSigninDate())){ | |||
| record.setCountYearSign(lastSignIn.getCountYearSign() + 1); | |||
| if(daysI == 1){ | |||
| record.setContinueYearSign(lastSignIn.getContinueYearSign() + 1); | |||
| }else{ | |||
| record.setContinueYearSign(1); | |||
| } | |||
| if(DateUtils.getMonth(today) == DateUtils.getMonth(lastSignIn.getSigninDate())){ | |||
| record.setCountMonthSign(lastSignIn.getCountMonthSign() + 1); | |||
| if(daysI == 1){ | |||
| record.setContinueMonthSign(lastSignIn.getContinueMonthSign() + 1); | |||
| }else{ | |||
| record.setContinueMonthSign(1); | |||
| } | |||
| }else{ | |||
| record.setCountMonthSign(1); | |||
| record.setContinueMonthSign(1); | |||
| } | |||
| }else{ | |||
| record.setContinueMonthSign(1); | |||
| record.setCountMonthSign(1); | |||
| record.setContinueYearSign(1); | |||
| record.setCountYearSign(1); | |||
| } | |||
| wxCUserBasicSignMapper.insert(record); | |||
| } | |||
| signInCreditHistory(record,EnumScoreType.SIGN_IN_DAY); | |||
| continueSignInAddCredit(record); | |||
| return record; | |||
| }else{ | |||
| //补签 | |||
| return null; | |||
| } | |||
| } | |||
| @Override | |||
| public WxCUserBasicSign getTodaySignIn(WxCUserBasicSign record) { | |||
| Calendar calendar = Calendar.getInstance(); | |||
| calendar.setTime(new Date()); | |||
| calendar.set(Calendar.HOUR_OF_DAY, 0); | |||
| calendar.set(Calendar.MINUTE, 0); | |||
| calendar.set(Calendar.SECOND, 0); | |||
| Date today = calendar.getTime();//今天零点 | |||
| calendar.set(DAY_OF_MONTH,calendar.get(DAY_OF_MONTH) +1); | |||
| Date tomorrow =calendar.getTime();//明天零点 | |||
| record.setStartDate(today); | |||
| record.setEndDate(tomorrow); | |||
| List<WxCUserBasicSign> list = wxCUserBasicSignMapper.findList(record); | |||
| if(list != null && list.size() == 1){ | |||
| return list.get(0); | |||
| }else if(list.size() > 1){ | |||
| DateFormat format = new SimpleDateFormat("yyyy-MM-dd"); | |||
| String todayString = format.format(today); | |||
| logger.error("用户签到数据异常{}"+record.getUserId()+"时间{}"+todayString); | |||
| return list.get(0); | |||
| } | |||
| return null; | |||
| } | |||
| @Override | |||
| public Map<String,Integer> getLastSignIn(WxCUserBasicSign record) { | |||
| Map<String,Integer> map = new HashMap<>(); | |||
| WxCUserBasicSign lastSignIn = wxCUserBasicSignMapper.getLastSignIn(record); | |||
| if(lastSignIn != null){ | |||
| long daysL = DateUtils.startToEnd(lastSignIn.getSigninDate(), new Date()); | |||
| int daysI = new Long(daysL).intValue(); | |||
| if(daysI <= 1){ | |||
| map.put("continueSign",lastSignIn.getContinueSign()%28); | |||
| }else{ | |||
| map.put("continueSign",0); | |||
| } | |||
| } | |||
| // if(lastSignIn != null && DateUtils.isSameMonth(lastSignIn.getSigninDate(),new Date())){ | |||
| // //本月连续签到天数 | |||
| // map.put("continueMonthSign",lastSignIn.getContinueMonthSign()); | |||
| // }else{ | |||
| // map.put("continueMonthSign",0); | |||
| // } | |||
| WxCreditHistory wxCreditHistory = new WxCreditHistory(); | |||
| wxCreditHistory.setTenantId(record.getFinalTenantId()); | |||
| wxCreditHistory.setCUserId(record.getUserId()); | |||
| wxCreditHistory.setCreditType(EnumScoreType.SIGN_IN_DAY.getCode()); | |||
| //每日签到 | |||
| if(wxCreditHistoryMapper.loginCount(wxCreditHistory) > 0){ | |||
| map.put("signInDay",1); | |||
| }else{ | |||
| map.put("signInDay",0); | |||
| } | |||
| //7日连续 | |||
| wxCreditHistory.setCreditType(EnumScoreType.SIGN_IN_SEVENDAY.getCode()); | |||
| if(wxCreditHistoryMapper.monthCount(wxCreditHistory) > 0 ){ | |||
| map.put("signInSevenDay",1); | |||
| }else{ | |||
| map.put("signInSevenDay",0); | |||
| } | |||
| //14日连续 | |||
| wxCreditHistory.setCreditType(EnumScoreType.SIGN_IN_FTDAY.getCode()); | |||
| if(wxCreditHistoryMapper.monthCount(wxCreditHistory) > 0 ){ | |||
| map.put("signInFTDay",1); | |||
| }else{ | |||
| map.put("signInFTDay",0); | |||
| } | |||
| //28日连续 | |||
| wxCreditHistory.setCreditType(EnumScoreType.SIGN_IN_TEDAY.getCode()); | |||
| if(wxCreditHistoryMapper.monthCount(wxCreditHistory) > 0 ){ | |||
| map.put("signInTEDay",1); | |||
| }else{ | |||
| map.put("signInTEDay",0); | |||
| } | |||
| return map; | |||
| } | |||
| @Override | |||
| public void signInCreditHistory(WxCUserBasicSign record, EnumScoreType enumScoreType){ | |||
| WxCreditHistory wxCreditHistory = new WxCreditHistory(); | |||
| wxCreditHistory.setCUserId(record.getUserId()); | |||
| wxCreditHistory.setTenantId(record.getFinalTenantId()); | |||
| wxCreditHistory.setCreateDate(new Date()); | |||
| wxCreditHistory.setCreditType(enumScoreType.getCode()); | |||
| wxCreditHistory.setChangePurpose(enumScoreType.getMessage()); | |||
| wxCreditHistory.setOperatorType(EnumUserType.CUSERBASIC.getCode()); | |||
| wxCreditHistory.setOperatorId(record.getUserId()); | |||
| wxCreditHistoryService.saveOrUpdate(wxCreditHistory,null); | |||
| } | |||
| @Override | |||
| public ResultData getListStatus(WxCUserBasicSign record) { | |||
| List list = new ArrayList(); | |||
| List<WxCUserBasicSign> recordList = wxCUserBasicSignMapper.findList(record); | |||
| if(recordList != null){ | |||
| for (WxCUserBasicSign sign:recordList) { | |||
| Map map = new HashMap<>(); | |||
| map.put("yyyy", DateUtils.getYear(sign.getSigninDate())); | |||
| map.put("mm", DateUtils.getMonth(sign.getSigninDate())); | |||
| map.put("dd", DateUtils.getMonthOfDate(sign.getSigninDate())); | |||
| list.add(map); | |||
| } | |||
| } | |||
| return new ResultData(list); | |||
| } | |||
| private void continueSignInAddCredit(WxCUserBasicSign record){ | |||
| int i = record.getContinueSign() % 28; | |||
| if(record.getContinueSign() > 0 && i == 0){ | |||
| signInCreditHistory(record,EnumScoreType.SIGN_IN_TEDAY); | |||
| }else if(i == 7){ | |||
| signInCreditHistory(record,EnumScoreType.SIGN_IN_SEVENDAY); | |||
| }else if(i == 14){ | |||
| signInCreditHistory(record,EnumScoreType.SIGN_IN_FTDAY); | |||
| } | |||
| } | |||
| } | |||
| @@ -273,14 +273,14 @@ public class WxCUserServiceImpl implements WxCUserService { | |||
| logger.error("c_user 成长值 " + e.getMessage()); | |||
| } | |||
| // 积分 | |||
| try { | |||
| credit = addCredit(user, EnumScoreType.LOGIN); | |||
| logger.info("user_id:" + user.getId() + " 登录新增积分:" + credit); | |||
| } catch (MallinkException e) { | |||
| logger.error("c_user 积分 " + e.getMessage()); | |||
| } catch (Exception e) { | |||
| logger.error("c_user 积分 " + e.getMessage()); | |||
| } | |||
| // try { | |||
| // credit = addCredit(user, EnumScoreType.LOGIN); | |||
| // logger.info("user_id:" + user.getId() + " 登录新增积分:" + credit); | |||
| // } catch (MallinkException e) { | |||
| // logger.error("c_user 积分 " + e.getMessage()); | |||
| // } catch (Exception e) { | |||
| // logger.error("c_user 积分 " + e.getMessage()); | |||
| // } | |||
| // 用户登陆后 更新最后一次活跃时间 | |||
| if (user.getUserId() != null) { | |||
| @@ -391,7 +391,8 @@ public class WxCreditHistoryServiceImpl implements WxCreditHistoryService { | |||
| private int creditIncrement(WxCreditHistory record) { | |||
| //查找C端用户的成长值 | |||
| if (record.getCreditType() == EnumScoreType.LOGIN.getCode()) { | |||
| return loginAddCredit(record); | |||
| // return loginAddCredit(record);//登陆加积分取消 | |||
| return 0; | |||
| } | |||
| if (record.getCreditType() == EnumScoreType.BIND_CAR.getCode()) { | |||
| return bindCarAddCredit(record); | |||
| @@ -430,6 +431,19 @@ public class WxCreditHistoryServiceImpl implements WxCreditHistoryService { | |||
| return record.getCreditNum(); | |||
| } | |||
| if (record.getCreditType() == EnumScoreType.SIGN_IN_DAY.getCode()) { | |||
| return signinCredit(record); | |||
| } | |||
| if (record.getCreditType() == EnumScoreType.SIGN_IN_SEVENDAY.getCode()) { | |||
| return signinMonthCredit(record,EnumScoreType.SIGN_IN_SEVENDAY); | |||
| } | |||
| if (record.getCreditType() == EnumScoreType.SIGN_IN_FTDAY.getCode()) { | |||
| return signinMonthCredit(record,EnumScoreType.SIGN_IN_FTDAY); | |||
| } | |||
| if (record.getCreditType() == EnumScoreType.SIGN_IN_TEDAY.getCode()) { | |||
| return signinMonthCredit(record,EnumScoreType.SIGN_IN_TEDAY); | |||
| } | |||
| return 0; | |||
| } | |||
| @@ -449,6 +463,28 @@ public class WxCreditHistoryServiceImpl implements WxCreditHistoryService { | |||
| return wxScoreRules.getRule(EnumScoreType.LOGIN, WxScoreRules.SCORE); | |||
| } | |||
| private int signinCredit(WxCreditHistory record) { | |||
| //如果当天已经登录过则跳过 | |||
| if (wxCreditHistoryMapper.loginCount(record) > 0) { | |||
| return 0; | |||
| } | |||
| // 1. 获取当前租户下积分的增加规则 | |||
| WxScoreRules wxScoreRules = wxScoreRulesService.getCreditRules(record.getTenantId()); | |||
| // 2. 增长的积分 | |||
| return wxScoreRules.getRule(EnumScoreType.SIGN_IN_DAY, WxScoreRules.SCORE); | |||
| } | |||
| private int signinMonthCredit(WxCreditHistory record,EnumScoreType enumScoreType) { | |||
| //签到周期按月来 | |||
| // if (wxCreditHistoryMapper.monthCount(record) > 0) { | |||
| // return 0; | |||
| // } | |||
| // 1. 获取当前租户下积分的增加规则 | |||
| WxScoreRules wxScoreRules = wxScoreRulesService.getCreditRules(record.getTenantId()); | |||
| // 2. 增长的积分 | |||
| return wxScoreRules.getRule(enumScoreType, WxScoreRules.SCORE); | |||
| } | |||
| private int bindCarAddCredit(WxCreditHistory record) { | |||
| if (wxCreditHistoryMapper.countList(record) > 0) { | |||
| return 0; | |||
| @@ -0,0 +1,89 @@ | |||
| package com.iformall.service.impl; | |||
| import com.github.pagehelper.PageHelper; | |||
| import com.github.pagehelper.PageInfo; | |||
| import com.iformall.common.IdWorker; | |||
| import com.iformall.common.Result; | |||
| import com.iformall.common.ResultData; | |||
| import com.iformall.domain.po.WxMerchantOcrModel; | |||
| import com.iformall.domain.po.WxOcrModel; | |||
| import com.iformall.mapper.WxMerchantOcrModelMapper; | |||
| import com.iformall.mapper.WxOcrModelMapper; | |||
| import com.iformall.service.WxOcrService; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.stereotype.Service; | |||
| import java.util.Date; | |||
| import java.util.List; | |||
| @Service | |||
| public class WxOcrServiceImpl implements WxOcrService { | |||
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||
| @Autowired | |||
| WxMerchantOcrModelMapper merchantOcrModelMapper; | |||
| @Autowired | |||
| WxOcrModelMapper ocrModelMapper; | |||
| @Override | |||
| public PageInfo<WxOcrModel> listOcrModelAsPage(WxOcrModel record, Integer pageIndex, Integer pageSize) { | |||
| return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> ocrModelMapper.findList(record)); | |||
| } | |||
| @Override | |||
| public WxOcrModel getOcrModelById(Long id) { | |||
| return ocrModelMapper.selectById(id); | |||
| } | |||
| @Override | |||
| public ResultData saveOrUpdateOcrModel(WxOcrModel record) { | |||
| Date date = new Date(); | |||
| if (record.getId() == null) { | |||
| final IdWorker idWorker = IdWorker.get(); | |||
| record.setId(idWorker.nextId()); | |||
| record.setCreateTime(date); | |||
| ocrModelMapper.insert(record); | |||
| } else { | |||
| record.setUpdateTime(date); | |||
| ocrModelMapper.updateById(record); | |||
| } | |||
| return new ResultData(Result.SUCCESS, "操作成功"); | |||
| } | |||
| @Override | |||
| public WxMerchantOcrModel getMerchantOcrModel(Long merchantId,String tenantId,String parentTenantId) { | |||
| WxMerchantOcrModel query = new WxMerchantOcrModel(); | |||
| query.setMerchantId(merchantId); | |||
| query.setTenantId(tenantId); | |||
| query.setParentTenantId(parentTenantId); | |||
| List<WxMerchantOcrModel> models = merchantOcrModelMapper.findList(query); | |||
| if (null == models || models.size() <= 0) { | |||
| return null; | |||
| } | |||
| return models.get(0); | |||
| } | |||
| @Override | |||
| public ResultData saveOrUpdateMerchantOcrModel(WxMerchantOcrModel record) { | |||
| Date date = new Date(); | |||
| if (record.getId() == null) { | |||
| final IdWorker idWorker = IdWorker.get(); | |||
| record.setId(idWorker.nextId()); | |||
| record.setCreateTime(date); | |||
| merchantOcrModelMapper.insert(record); | |||
| } else { | |||
| record.setUpdateTime(date); | |||
| merchantOcrModelMapper.updateById(record); | |||
| } | |||
| return new ResultData(Result.SUCCESS, "操作成功"); | |||
| } | |||
| @Override | |||
| public ResultData deleteMerchantOcrModel(Long id) { | |||
| merchantOcrModelMapper.deleteById(id); | |||
| return new ResultData(Result.SUCCESS, "操作成功"); | |||
| } | |||
| } | |||
| @@ -52,50 +52,18 @@ public class WxScoreRulesServiceImpl implements WxScoreRulesService { | |||
| public void wxScoreRulesInit(String tenantId) { | |||
| WxScoreRules wxScoreRules = new WxScoreRules(); | |||
| wxScoreRules.setTenantId(tenantId); | |||
| wxScoreRules.setRules("[{\"id\": 1, \"desc\": \"每日登陆\", \"step\": 1, \"limit\": 0, \"score\": 0}," + | |||
| " {\"id\": 2, \"score\": null, \"childs\": " + | |||
| "[{\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"餐饮\", \"businessId\": 1}," + | |||
| " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"娱乐\", \"businessId\": 2}," + | |||
| " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"服饰\", \"businessId\": 3}," + | |||
| " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"亲子\", \"businessId\": 4}," + | |||
| " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"超市\", \"businessId\": 5}," + | |||
| " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"美妆\", \"businessId\": 7}," + | |||
| " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"珠宝\", \"businessId\": 8}," + | |||
| " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"服务\", \"businessId\": 9}," + | |||
| " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"家居\", \"businessId\": 10}," + | |||
| " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"数码家电\", \"businessId\": 11}," + | |||
| " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"其他\", \"businessId\": 6}]}," + | |||
| " {\"id\": 3, \"desc\": \"绑定车牌1个\", \"step\": 1, \"limit\": 1, \"score\": 0}," + | |||
| " {\"id\": 6, \"desc\": \"授权手机号\", \"step\": 1, \"limit\": 1, \"score\": 0}," + | |||
| " {\"id\": 7, \"desc\": \"编辑个人信息\", \"step\": 1, \"limit\": 1, \"score\": 0}]"); | |||
| wxScoreRules.setRules(WxScoreRules.getCreditDefaultRules()); | |||
| wxScoreRules.setCreateDate(new Date()); | |||
| wxScoreRules.setUpdateDate(new Date()); | |||
| wxScoreRules.setType(2); | |||
| wxScoreRules.setClearYear(1); | |||
| wxScoreRules.setScale(10); | |||
| wxScoreRules.setType(EnumScoreRules.CREDIT.getCode()); | |||
| wxScoreRules.setCreditLocked(1); | |||
| wxScoreRulesMapper.insert(wxScoreRules); | |||
| wxScoreRules = new WxScoreRules(); | |||
| wxScoreRules.setTenantId(tenantId); | |||
| wxScoreRules.setRules("[{\"id\": 1, \"desc\": \"每日登陆\", \"step\": 1, \"limit\": 0, \"score\": 0}," + | |||
| " {\"id\": 2, \"score\": 0, \"childs\": " + | |||
| "[{\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"餐饮\", \"businessId\": 1}," + | |||
| " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"娱乐\", \"businessId\": 2}," + | |||
| " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"服饰\", \"businessId\": 3}," + | |||
| " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"亲子\", \"businessId\": 4}," + | |||
| " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"超市\", \"businessId\": 5}," + | |||
| " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"美妆\", \"businessId\": 7}," + | |||
| " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"珠宝\", \"businessId\": 8}," + | |||
| " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"服务\", \"businessId\": 9}," + | |||
| " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"家居\", \"businessId\": 10}," + | |||
| " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"数码家电\", \"businessId\": 11}," + | |||
| " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"其他\", \"businessId\": 6}]}," + | |||
| " {\"id\": 3, \"desc\": \"绑定车牌1个\", \"step\": 1, \"limit\": 1, \"score\": 0}," + | |||
| " {\"id\": 6, \"desc\": \"授权手机号\", \"step\": 1, \"limit\": 1, \"score\": 0}," + | |||
| " {\"id\": 7, \"desc\": \"编辑个人信息\", \"step\": 1, \"limit\": 1, \"score\": 0}]"); | |||
| wxScoreRules.setRules(WxScoreRules.getScoreDefaultRules()); | |||
| wxScoreRules.setCreateDate(new Date()); | |||
| wxScoreRules.setUpdateDate(new Date()); | |||
| wxScoreRules.setType(1); | |||
| wxScoreRules.setType(EnumScoreRules.SCORE.getCode()); | |||
| wxScoreRules.setCreditLocked(0); | |||
| wxScoreRulesMapper.insert(wxScoreRules); | |||
| } | |||
| @@ -145,9 +113,18 @@ public class WxScoreRulesServiceImpl implements WxScoreRulesService { | |||
| //当成长值或积分规则新增时,将新增的数据一并返回给接口调用端 | |||
| private String getScoreRulesNew(String scoreRules,EnumScoreRules enumScoreRules){ | |||
| //getJSONObject(1) 为EnumScoreType.CONSUMPTION(2, "消费")的下标值 | |||
| JSONArray jsonArrayOld = JSONArray.parseArray(scoreRules).getJSONObject(1).getJSONArray("childs"); | |||
| String defaultRules = enumScoreRules.equals(EnumScoreRules.SCORE) ? WxScoreRules.getScoreDefaultRules() : WxScoreRules.getCreditDefaultRules(); | |||
| JSONArray jsonArrayDefault = JSONArray.parseArray(defaultRules).getJSONObject(1).getJSONArray("childs"); | |||
| JSONArray jsonArrayOld = new JSONArray(); | |||
| JSONArray jsonArrayDefault = new JSONArray(); | |||
| if(enumScoreRules.equals(EnumScoreRules.SCORE)){ | |||
| jsonArrayOld = JSONArray.parseArray(scoreRules).getJSONObject(1).getJSONArray("childs"); | |||
| String defaultRules = WxScoreRules.getScoreDefaultRules(); | |||
| jsonArrayDefault = JSONArray.parseArray(defaultRules).getJSONObject(1).getJSONArray("childs"); | |||
| }else if(enumScoreRules.equals(EnumScoreRules.CREDIT)){ | |||
| jsonArrayOld = JSONArray.parseArray(scoreRules).getJSONObject(0).getJSONArray("childs"); | |||
| String defaultRules = WxScoreRules.getCreditDefaultRules(); | |||
| jsonArrayDefault = JSONArray.parseArray(defaultRules).getJSONObject(0).getJSONArray("childs"); | |||
| } | |||
| if (jsonArrayOld.size() < jsonArrayDefault.size()) { | |||
| JSONArray childsJsonArray = new JSONArray(); | |||
| JSONObject otherJSONObject = new JSONObject(); | |||
| @@ -104,8 +104,10 @@ public class CreditUtil { | |||
| if(Objects.nonNull(wxCUserBasicInfo.getScoreDate())){ | |||
| int scoreYear = DateUtils.getYear(wxCUserBasicInfo.getScoreDate()); | |||
| int year = DateUtils.getYear(new Date()); | |||
| if(scoreYear == year && DateUtils.isBirthdays(wxCUserBasicInfo.getScoreDate())){ | |||
| birthdayScale = getBirthdayScoreScale(tenantId, wxScoreRulesService); | |||
| if(scoreYear == year){ | |||
| if(DateUtils.isBirthdays(wxCUserBasicInfo.getScoreDate())){ | |||
| birthdayScale = getBirthdayScoreScale(tenantId, wxScoreRulesService); | |||
| } | |||
| }else{ | |||
| if (Objects.nonNull(wxCUserBasicInfo.getBirthdate()) && DateUtils.isBirthdays(wxCUserBasicInfo.getBirthdate())) { | |||
| birthdayScale = getBirthdayScoreScale(tenantId,wxScoreRulesService); | |||
| @@ -1362,4 +1362,19 @@ public class DateUtils { | |||
| return false; | |||
| } | |||
| /** | |||
| * 获取当前日期零点<br> | |||
| * | |||
| * @param date | |||
| * @return 获取当前日期零点 | |||
| */ | |||
| public static Date getDateZero(Date date) { | |||
| Calendar cal = Calendar.getInstance(); | |||
| cal.setTime(date); | |||
| cal.set(Calendar.HOUR_OF_DAY, 0); | |||
| cal.set(Calendar.MINUTE, 0); | |||
| cal.set(Calendar.SECOND, 0); | |||
| return cal.getTime(); | |||
| } | |||
| } | |||
| @@ -66,9 +66,13 @@ | |||
| and `type` = #{type} | |||
| </if> | |||
| <if test=" null != status "> | |||
| <if test=" null != status and status != 3"> | |||
| and `status` = #{status} | |||
| </if> | |||
| <if test=" null != status and status == 3"> | |||
| and `status` >= 2 and `status` <= 3 | |||
| </if> | |||
| <if test=" null != createTime "> | |||
| and `create_time` = #{createTime} | |||
| @@ -85,8 +89,12 @@ | |||
| and `is_expired` = #{isExpired} | |||
| </if> | |||
| <if test=" null != starttime and null!=endtime "> | |||
| and `create_time` between #{starttime} and #{endtime} | |||
| <!-- <if test=" null != startDate and null != endDate ">--> | |||
| <!-- and `create_time` between #{starttime} and #{endtime}--> | |||
| <!-- </if>--> | |||
| <if test=" null != startDate and null != endDate "> | |||
| and `activity_start_time` >= #{startDate} and `activity_end_time` < #{endDate} | |||
| </if> | |||
| <if test=" null != sendMsg "> | |||
| @@ -0,0 +1,91 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |||
| <mapper namespace="com.iformall.mapper.WxCUserBasicSignMapper"> | |||
| <resultMap id="BaseResultMap" type="com.iformall.domain.po.WxCUserBasicSign"> | |||
| <id column="id" jdbcType="BIGINT" property="id" /> | |||
| <result column="tenant_id" jdbcType="VARCHAR" property="tenantId" /> | |||
| <result column="parent_tenant_id" jdbcType="VARCHAR" property="parentTenantId"/> | |||
| <result column="user_id" jdbcType="BIGINT" property="userId" /> | |||
| <result column="type" jdbcType="INTEGER" property="type" /> | |||
| <result column="signin_date" jdbcType="TIMESTAMP" property="signinDate"/> | |||
| <result column="create_date" jdbcType="TIMESTAMP" property="createDate"/> | |||
| <result column="update_date" jdbcType="TIMESTAMP" property="updateDate"/> | |||
| <result column="continue_month_sign" jdbcType="INTEGER" property="continueMonthSign" /> | |||
| <result column="count_month_sign" jdbcType="INTEGER" property="countMonthSign" /> | |||
| <result column="continue_year_sign" jdbcType="INTEGER" property="continueYearSign" /> | |||
| <result column="count_year_sign" jdbcType="INTEGER" property="countYearSign" /> | |||
| <result column="continue_sign" jdbcType="INTEGER" property="continueSign" /> | |||
| <result column="count_sign" jdbcType="INTEGER" property="countSign" /> | |||
| <result column="mark" jdbcType="VARCHAR" property="mark" /> | |||
| </resultMap> | |||
| <sql id="allColumns"> | |||
| `id`,`tenant_id`,`parent_tenant_id`,`user_id`,`type`,`signin_date`,`create_date`,`update_date`, | |||
| `continue_month_sign`,`count_month_sign`,`continue_year_sign`,`count_year_sign`, | |||
| `continue_sign`,`count_sign`,`mark` | |||
| </sql> | |||
| <sql id="dynamicWhereConditions"> | |||
| where 1 = 1 | |||
| <if test=" null != id "> | |||
| and `id` = #{id} | |||
| </if> | |||
| <if test=" null != tenantId and '' != tenantId"> | |||
| and `tenant_id` = #{tenantId} | |||
| </if> | |||
| <if test=" null != parentTenantId and '' != parentTenantId"> | |||
| and `parent_tenant_id` = #{parentTenantId} | |||
| </if> | |||
| <if test=" null != userId "> | |||
| and `user_id` = #{userId} | |||
| </if> | |||
| <if test=" null != type "> | |||
| and `type` = #{type} | |||
| </if> | |||
| <if test=" null != startDate "> | |||
| and `signin_date` >= #{startDate} | |||
| </if> | |||
| <if test=" null != endDate"> | |||
| and `signin_date` < #{endDate} | |||
| </if> | |||
| <if test=" null != ids "> | |||
| and id in | |||
| <foreach collection="ids" index="index" item="idItem" open="(" separator="," close=")"> | |||
| #{idItem} | |||
| </foreach> | |||
| </if> | |||
| order by `signin_date` desc | |||
| </sql> | |||
| <select id="findList" parameterType="com.iformall.domain.po.WxCUserBasicSign" resultMap="BaseResultMap"> | |||
| select <include refid="allColumns" /> | |||
| from wx_c_user_basic_sign | |||
| <include refid="dynamicWhereConditions" /> | |||
| </select> | |||
| <select id="getLastSignIn" parameterType="com.iformall.domain.po.WxCUserBasicSign" resultMap="BaseResultMap"> | |||
| select <include refid="allColumns" />,max(`signin_date`) from wx_c_user_basic_sign | |||
| where 1 = 1 | |||
| <if test=" null != tenantId and '' != tenantId"> | |||
| and `tenant_id` = #{tenantId} | |||
| </if> | |||
| <if test=" null != parentTenantId and '' != parentTenantId"> | |||
| and `parent_tenant_id` = #{parentTenantId} | |||
| </if> | |||
| <if test=" null != userId "> | |||
| and `user_id` = #{userId} | |||
| </if> | |||
| group by user_id | |||
| </select> | |||
| </mapper> | |||
| @@ -184,6 +184,18 @@ | |||
| and DATEDIFF(`create_date`,now())=0 | |||
| </select> | |||
| <select id="monthCount" parameterType="com.iformall.domain.po.WxCreditHistory" resultType="java.lang.Integer"> | |||
| select COUNT(0) from wx_credit_history | |||
| where 1=1 | |||
| <if test=" null != cUserId "> | |||
| and `c_user_id` = #{cUserId} | |||
| </if> | |||
| <if test=" null != creditType "> | |||
| and `credit_type` = #{creditType} | |||
| </if> | |||
| and DATE_FORMAT(`create_date`,'%Y%m') = DATE_FORMAT(CURDATE(),'%Y%m'); | |||
| </select> | |||
| <select id="countTodayList" parameterType="com.iformall.domain.po.WxCreditHistory" resultType="java.lang.Integer"> | |||
| select count(0) | |||
| from wx_credit_history | |||
| @@ -0,0 +1,57 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |||
| <mapper namespace="com.iformall.mapper.WxMerchantOcrModelMapper"> | |||
| <resultMap type="com.iformall.domain.po.WxMerchantOcrModel" id="BaseResultMap"> | |||
| <result property="id" column="id"/> | |||
| <result property="tenantId" column="tenant_id" jdbcType="VARCHAR"/> | |||
| <result property="parentTenantId" column="parent_tenant_id" jdbcType="VARCHAR"/> | |||
| <result property="merchantId" column="merchant_id" jdbcType="BIGINT"/> | |||
| <result property="ocrModelId" column="ocr_model_id" jdbcType="BIGINT"/> | |||
| <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/> | |||
| <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/> | |||
| </resultMap> | |||
| <sql id="allColumns"> | |||
| id,tenant_id,parent_tenant_id,merchant_id,ocr_model_id,create_time,update_time | |||
| </sql> | |||
| <sql id="dynamicWhereConditions"> | |||
| where 1 = 1 | |||
| <if test=" null != id "> | |||
| and `id` = #{id} | |||
| </if> | |||
| <if test=" null != tenantId and '' != tenantId"> | |||
| and `tenant_id` = #{tenantId} | |||
| </if> | |||
| <if test=" null != parentTenantId and '' != parentTenantId"> | |||
| and `parent_tenant_id` = #{parentTenantId} | |||
| </if> | |||
| <if test=" null != merchantId "> | |||
| and `merchant_id` = #{merchantId} | |||
| </if> | |||
| <if test=" null != ocrModelId "> | |||
| and `ocr_model_id` = #{ocrModelId} | |||
| </if> | |||
| <if test=" null != ids "> | |||
| and id in | |||
| <foreach collection="ids" index="index" item="idItem" open="(" separator="," close=")"> | |||
| #{idItem} | |||
| </foreach> | |||
| </if> | |||
| <if test=" null != sortColumns">order by ${sortColumns}</if> | |||
| </sql> | |||
| <select id="findList" parameterType="com.iformall.domain.po.WxMerchantOcrModel" resultMap="BaseResultMap"> | |||
| select | |||
| <include refid="allColumns"/> | |||
| from wx_merchant_ocr_model | |||
| <include refid="dynamicWhereConditions"/> | |||
| </select> | |||
| </mapper> | |||
| @@ -0,0 +1,54 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |||
| <mapper namespace="com.iformall.mapper.WxOcrModelMapper"> | |||
| <resultMap type="com.iformall.domain.po.WxOcrModel" id="BaseResultMap"> | |||
| <result property="id" column="id"/> | |||
| <result property="langCode" column="lang_code" jdbcType="VARCHAR"/> | |||
| <result property="fontName" column="font_name" jdbcType="VARCHAR"/> | |||
| <result property="remark" column="remark" jdbcType="VARCHAR"/> | |||
| <result property="status" column="status" jdbcType="INTEGER"/> | |||
| <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/> | |||
| <result property="update_time" column="updateTime" jdbcType="TIMESTAMP"/> | |||
| </resultMap> | |||
| <sql id="allColumns"> | |||
| id,lang_code,font_name,remark,status,create_time,updateTime | |||
| </sql> | |||
| <sql id="dynamicWhereConditions"> | |||
| where 1 = 1 | |||
| <if test=" null != id "> | |||
| and `id` = #{id} | |||
| </if> | |||
| <if test=" null != langCode and '' != langCode"> | |||
| and `lang_code` = #{langCode} | |||
| </if> | |||
| <if test=" null != fontName and '' != fontName"> | |||
| and `font_name` = #{fontName} | |||
| </if> | |||
| <if test=" null != status "> | |||
| and `status` = #{status} | |||
| </if> | |||
| <if test=" null != ids "> | |||
| and id in | |||
| <foreach collection="ids" index="index" item="idItem" open="(" separator="," close=")"> | |||
| #{idItem} | |||
| </foreach> | |||
| </if> | |||
| <if test=" null != sortColumns">order by ${sortColumns}</if> | |||
| </sql> | |||
| <select id="findList" parameterType="com.iformall.domain.po.WxOcrModel" resultMap="BaseResultMap"> | |||
| select | |||
| <include refid="allColumns"/> | |||
| from wx_ocr_model | |||
| <include refid="dynamicWhereConditions"/> | |||
| </select> | |||
| </mapper> | |||
| @@ -39,6 +39,13 @@ | |||
| <groupId>com.github.axet</groupId> | |||
| <artifactId>kaptcha</artifactId> | |||
| <version>0.0.9</version> | |||
| </dependency> | |||
| <!-- ocr --> | |||
| <dependency> | |||
| <groupId>com.iformall</groupId> | |||
| <artifactId>mallinkOcr</artifactId> | |||
| <version>1.0</version> | |||
| </dependency> | |||
| </dependencies> | |||
| @@ -34,6 +34,9 @@ public class SysApplication { | |||
| @Value("${fm.upload_dir}") | |||
| private String uploadDir; | |||
| @Value("${fm.ocr_data}") | |||
| private String ocrData; | |||
| @Bean | |||
| public boolean isFmException() { | |||
| return fmException; | |||
| @@ -0,0 +1,220 @@ | |||
| package com.iformall.controller.ocr; | |||
| import com.github.pagehelper.PageInfo; | |||
| import com.iformall.annotation.SystemControllerLog; | |||
| import com.iformall.common.ErrorCode; | |||
| import com.iformall.common.Result; | |||
| import com.iformall.common.ResultData; | |||
| import com.iformall.controller.base.BaseController; | |||
| import com.iformall.domain.po.MallUserInfo; | |||
| import com.iformall.domain.po.WxMall; | |||
| import com.iformall.domain.po.WxMerchant; | |||
| import com.iformall.domain.po.WxMerchantOcrModel; | |||
| import com.iformall.domain.po.WxOcrModel; | |||
| import com.iformall.domain.po.base.TenantEntity; | |||
| import com.iformall.domain.po.base.BaseEntity.SortField; | |||
| import com.iformall.enums.EnumFromType; | |||
| import com.iformall.enums.EnumRentStartType; | |||
| import com.iformall.ocr.FormallTess4j; | |||
| import com.iformall.ocr.FormallTess4jTrain; | |||
| import com.iformall.service.WxMallService; | |||
| import com.iformall.service.WxMerchantService; | |||
| import com.iformall.service.WxOcrService; | |||
| import io.swagger.annotations.ApiImplicitParam; | |||
| import io.swagger.annotations.ApiImplicitParams; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import java.io.File; | |||
| import java.io.FileOutputStream; | |||
| import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import java.io.OutputStream; | |||
| import java.util.Date; | |||
| import java.util.Map; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.web.bind.annotation.*; | |||
| import org.springframework.web.multipart.MultipartFile; | |||
| @RestController | |||
| @RequestMapping("ocr") | |||
| public class WxOcrController extends BaseController { | |||
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||
| @Autowired | |||
| private WxOcrService ocrService; | |||
| @Autowired | |||
| private WxMerchantService merchantService; | |||
| @Autowired | |||
| private String ocrData; | |||
| /** | |||
| * 模板列表 | |||
| * @param wxRentContract | |||
| * @param pageNum | |||
| * @param pageSize | |||
| * @return | |||
| */ | |||
| @GetMapping("/modelList") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), | |||
| @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) | |||
| public ResultData modelList(@ModelAttribute WxOcrModel ocrModel, Integer pageNum, Integer pageSize) { | |||
| if (null == ocrModel) { | |||
| ocrModel = new WxOcrModel(); | |||
| } | |||
| ocrModel.setSortColumns(SortField.Createtime_DESC); | |||
| PageInfo<WxOcrModel> page = ocrService.listOcrModelAsPage(ocrModel, pageNum, pageSize); | |||
| return new ResultData(page); | |||
| } | |||
| /** | |||
| * 更新模板 | |||
| * @param wxRentContract | |||
| * @return | |||
| */ | |||
| @PostMapping("updateModel") | |||
| public ResultData updateModel(@RequestBody WxOcrModel ocrModel) { | |||
| return ocrService.saveOrUpdateOcrModel(ocrModel); | |||
| } | |||
| /** | |||
| * 根据商户查询模板 | |||
| * @param wxRentContract | |||
| * @return | |||
| */ | |||
| @GetMapping("merchantModel") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "merchantId", value = "商户编号", dataType = "Long", paramType = "query", required = true) | |||
| }) | |||
| public ResultData merchantModel(Long merchantId) { | |||
| WxMerchant merchant = merchantService.getById(merchantId); | |||
| if (null == merchant) { | |||
| return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),"商户数据不存在"); | |||
| } | |||
| return new ResultData(ocrService.getMerchantOcrModel(merchantId, merchant.getTenantId(), merchant.getParentTenantId())); | |||
| } | |||
| /** | |||
| * 更新商户模板 | |||
| * @param wxRentContract | |||
| * @return | |||
| */ | |||
| @PostMapping("updateMerchantModel") | |||
| public ResultData updateMerchantModel(@RequestBody WxMerchantOcrModel merchantModel) { | |||
| return ocrService.saveOrUpdateMerchantOcrModel(merchantModel); | |||
| } | |||
| /** | |||
| * 删除商户模板 | |||
| * @param wxRentContract | |||
| * @return | |||
| */ | |||
| @PostMapping("deleteMerchantModel") | |||
| public ResultData deleteMerchantModel(@RequestBody WxMerchantOcrModel merchantModel) { | |||
| return ocrService.deleteMerchantOcrModel(merchantModel.getId()); | |||
| } | |||
| /** | |||
| * 获取训练步骤 | |||
| * @return | |||
| */ | |||
| @GetMapping("getTrainSteps") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "modelId", value = "模板编号", dataType = "Long", paramType = "query", required = true) | |||
| }) | |||
| public ResultData getTrainSteps(Long modelId) { | |||
| WxOcrModel model = ocrService.getOcrModelById(modelId); | |||
| if (null == model) { | |||
| return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),"ocr模板不存在"); | |||
| } | |||
| return new ResultData(FormallTess4jTrain.getTrainSteps(model.getLangCode(), model.getFontName())); | |||
| } | |||
| /** | |||
| *测试训练结果 | |||
| * @return | |||
| */ | |||
| @PostMapping(value = "/testTrain", consumes = "multipart/*", headers = "content-type=multipart/form-data") | |||
| public ResultData testTrain(@RequestParam("file") MultipartFile multiReq,@RequestParam("modelId") Long modelId) { | |||
| try { | |||
| WxOcrModel model = ocrService.getOcrModelById(modelId); | |||
| if (null == model) { | |||
| return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),"ocr模板不存在"); | |||
| } | |||
| File file = multipartFileToFile(multiReq); | |||
| String result = FormallTess4j.testDoOCR_File(ocrData, file, model.getFontName()); | |||
| return new ResultData(result); | |||
| } catch (Exception e) { | |||
| logger.error("testTrain error.",e); | |||
| return new ResultData(ErrorCode.PICTURE_ANALYZING_ERROR.getCode(),"解析失败。"+e.getMessage()); | |||
| } | |||
| } | |||
| private File multipartFileToFile(MultipartFile file) { | |||
| File toFile = null; | |||
| if (file.equals("") || file.getSize() <= 0) { | |||
| file = null; | |||
| } else { | |||
| InputStream ins = null; | |||
| try { | |||
| ins = file.getInputStream(); | |||
| toFile = new File(file.getOriginalFilename()); | |||
| inputStreamToFile(ins, toFile); | |||
| ins.close(); | |||
| } catch (IOException e) { | |||
| logger.error("multipartFileToFile error.",e); | |||
| }finally { | |||
| if (null != ins) { | |||
| try { | |||
| ins.close(); | |||
| } catch (IOException e) { | |||
| logger.error("multipartFileToFile error.",e); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| return toFile; | |||
| } | |||
| private void inputStreamToFile(InputStream ins, File file) { | |||
| OutputStream os = null; | |||
| try { | |||
| os = new FileOutputStream(file); | |||
| int bytesRead = 0; | |||
| byte[] buffer = new byte[8192]; | |||
| while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) { | |||
| os.write(buffer, 0, bytesRead); | |||
| } | |||
| os.close(); | |||
| ins.close(); | |||
| } catch (Exception e) { | |||
| logger.error("inputStreamToFile error.",e); | |||
| }finally { | |||
| if (null != os) { | |||
| try { | |||
| os.close(); | |||
| } catch (IOException e) { | |||
| logger.error("inputStreamToFile error.",e); | |||
| } | |||
| } | |||
| if (null != ins) { | |||
| try { | |||
| ins.close(); | |||
| } catch (IOException e) { | |||
| logger.error("inputStreamToFile error.",e); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -165,6 +165,7 @@ fm: | |||
| deploy: 1 | |||
| open: true | |||
| upload_dir: /home/test/server/uploads/ | |||
| ocr_data: /home/test/server/ocr_data/ | |||
| ueditor: | |||
| config: config.json | |||
| @@ -122,12 +122,14 @@ fm: | |||
| deploy: 3 | |||
| open: true | |||
| upload_dir: /root/uploads/ | |||
| ocr_data: /root/ocr_data/ | |||
| ueditor: | |||
| config: config.json | |||
| unified: true | |||
| upload-path: ./upload/ | |||
| url-prefix: "" | |||
| logging: | |||
| level: | |||
| @@ -100,6 +100,7 @@ fm: | |||
| deploy: 2 | |||
| open: true | |||
| upload_dir: /home/ec2-user/server/uploads/ | |||
| ocr_data: /home/ec2-user/server/ocr_data/ | |||
| ueditor: | |||
| config: config.json | |||