yuhaitao14 %!s(int64=7) %!d(string=hai) anos
pai
achega
66e060f9f5

+ 4 - 0
shop/pom.xml

@@ -34,6 +34,10 @@
 			<groupId>org.springframework.boot</groupId>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-thymeleaf</artifactId>
 			<artifactId>spring-boot-starter-thymeleaf</artifactId>
 		</dependency>
 		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-data-redis</artifactId>
+		</dependency>
 		<dependency>
 		<dependency>
 			<groupId>com.alibaba</groupId>
 			<groupId>com.alibaba</groupId>
 			<artifactId>druid</artifactId>
 			<artifactId>druid</artifactId>

+ 27 - 0
shop/src/main/java/com/zskk/shop/Application.java

@@ -6,15 +6,22 @@ import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.cache.annotation.EnableCaching;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Bean;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.zskk.shop.aspect.AccessControlFilter;
 import com.zskk.shop.aspect.AccessControlFilter;
+import com.zskk.shop.utils.KeySerializer;
 
 
 
 
 @SpringBootApplication
 @SpringBootApplication
 @MapperScan("com.zskk.shop.dao")
 @MapperScan("com.zskk.shop.dao")
 @EnableTransactionManagement
 @EnableTransactionManagement
+@EnableCaching
 public class Application {
 public class Application {
 	public static void main(String[] args) {
 	public static void main(String[] args) {
 		SpringApplication.run(Application.class, args);
 		SpringApplication.run(Application.class, args);
@@ -27,4 +34,24 @@ public class Application {
 		registrationBean.setUrlPatterns(Arrays.asList("/*"));
 		registrationBean.setUrlPatterns(Arrays.asList("/*"));
 		return registrationBean;
 		return registrationBean;
 	}
 	}
+	
+	@Bean
+	public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
+		RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
+		redisTemplate.setConnectionFactory(redisConnectionFactory);
+
+		// 使用Jackson2JsonRedisSerialize 替换默认序列化
+		Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(
+				Object.class);
+
+		ObjectMapper objectMapper = new ObjectMapper();
+		objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+		jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
+
+		// 设置value的序列化规则和 key的序列化规则
+		redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
+		redisTemplate.setKeySerializer(new KeySerializer());
+		redisTemplate.afterPropertiesSet();
+		return redisTemplate;
+	}
 }
 }

+ 77 - 0
shop/src/main/java/com/zskk/shop/controller/admin/ExchangeCodeController.java

@@ -0,0 +1,77 @@
+/**
+* @版权信息 (@copyright Copyright 2017-XXXX JDJR.COM All Right Reserved);
+* @see
+* @author 于海涛 京东金融【技术研发部-证券及营销平台研发部-营销平台研发部】
+* @version 1.0
+* @date 2018年7月17日
+*/
+
+package com.zskk.shop.controller.admin;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.zskk.shop.controller.AbstractController;
+import com.zskk.shop.controller.bean.ControllerResult;
+import com.zskk.shop.controller.bean.UserInfoBean;
+import com.zskk.shop.dao.entry.ExchangeCode;
+import com.zskk.shop.exception.ErrorConstant;
+import com.zskk.shop.exception.ZSKKException;
+import com.zskk.shop.service.ExchangeCodeService;
+import com.zskk.shop.utils.ToolsUtil;
+
+@Controller
+@RequestMapping("/manage/exchangecode")
+public class ExchangeCodeController extends AbstractController {
+
+	@Autowired
+	public ExchangeCodeService exchangeCodeService;
+	
+	@RequestMapping("list")
+	@ResponseBody
+	public ControllerResult list(@RequestParam(name="gid", required=false) Integer gid, 
+			@RequestParam(name="search", required=false) String search, @RequestParam(name="status", required=false) Integer status){
+		if (search != null && search.isEmpty()){
+			search = null;
+		}
+		return new ControllerResult(exchangeCodeService.queryAllExchangeCode(search, status, gid));
+	}
+	
+	@RequestMapping("create")
+	@ResponseBody
+	public ControllerResult createExchangeCode(@RequestParam("gid") Integer gid, @RequestParam("num") Integer num, 
+			@RequestParam("remark")String remark, @RequestParam("endtime") String endtime){
+		UserInfoBean user = this.getUserInfo();
+		
+		Integer time = ToolsUtil.parseTime(endtime, ToolsUtil.getBirthFormat());
+		
+		exchangeCodeService.createExchangeCode(user.getUser(), gid, num, remark, time);
+		return new ControllerResult(Boolean.TRUE);
+	}
+	
+	@RequestMapping("get")
+	@ResponseBody
+	public ControllerResult get(@RequestParam("id") Integer id){
+		return new ControllerResult(exchangeCodeService.queryOneExchangeCode(id));
+	}
+	
+	@RequestMapping("update")
+	@ResponseBody
+	public ControllerResult update(@RequestParam("id") Integer id, @RequestParam("status") Integer status, @RequestParam("remark")String remark, @RequestParam("endtime") String endtime){
+		ExchangeCode data = exchangeCodeService.queryOneExchangeCode(id);
+		if (data == null){
+			throw new ZSKKException(ErrorConstant.PARAM_ERROR);
+		}
+		Integer time = ToolsUtil.parseTime(endtime, ToolsUtil.getBirthFormat());
+		return new ControllerResult(exchangeCodeService.update(data, remark, status, time));
+	}
+	
+	@RequestMapping("getitems")
+	@ResponseBody
+	public ControllerResult getItems(@RequestParam("eid") Integer eid, @RequestParam(name="status", required=false) Integer status){
+		return new ControllerResult(exchangeCodeService.getItems(eid, status));
+	}
+}

+ 2 - 2
shop/src/main/java/com/zskk/shop/dao/ExchangeCodeMapper.java

@@ -16,11 +16,11 @@ import com.zskk.shop.dao.entry.ExchangeCode;
 import com.zskk.shop.dao.entry.ExchangeCodeItem;
 import com.zskk.shop.dao.entry.ExchangeCodeItem;
 
 
 public interface ExchangeCodeMapper {
 public interface ExchangeCodeMapper {
-	public List<ExchangeCode> queryAllExchangeCode(@Param("search") String search, @Param("status") Integer status);
+	public List<ExchangeCode> queryAllExchangeCode(@Param("search") String search, @Param("status") Integer status, @Param("gid") Integer gid);
 	
 	
 	public ExchangeCode queryOneExchangeCode(@Param("id") Integer id);
 	public ExchangeCode queryOneExchangeCode(@Param("id") Integer id);
 	
 	
-	public void insertExchangeCode(ExchangeCode data);
+	public Integer insertExchangeCode(ExchangeCode data);
 	
 	
 	public int updateExchangeCode(ExchangeCode data);
 	public int updateExchangeCode(ExchangeCode data);
 	
 	

+ 165 - 0
shop/src/main/java/com/zskk/shop/service/ExchangeCodeService.java

@@ -0,0 +1,165 @@
+/**
+* @版权信息 (@copyright Copyright 2017-XXXX JDJR.COM All Right Reserved);
+* @see
+* @author 于海涛 京东金融【技术研发部-证券及营销平台研发部-营销平台研发部】
+* @version 1.0
+* @date 2018年7月17日
+*/
+
+package com.zskk.shop.service;
+
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.zskk.shop.controller.bean.UserBean;
+import com.zskk.shop.dao.ExchangeCodeMapper;
+import com.zskk.shop.dao.entry.ExchangeCode;
+import com.zskk.shop.dao.entry.ExchangeCodeItem;
+import com.zskk.shop.exception.ErrorConstant;
+import com.zskk.shop.exception.ZSKKException;
+import com.zskk.shop.utils.ToolsUtil;
+
+@Service
+public class ExchangeCodeService {
+	
+	/**
+	 * 兑换码状态  启用
+	 */
+	public static final Integer EXCHANGE_CODE_STATUS_OK = 1;
+	
+	/**
+	 *  兑换码状态 禁用 
+	 */
+	public static final Integer EXCHANGE_CODE_STATUS_NO = 0;
+	
+	private static final Integer PAGE_SIZE = 100;
+	
+	private static final Long INCREMENT_INIT_VALUE = 1L;
+	
+	private static final DecimalFormat DAY_TIME_FORMAT = new DecimalFormat("000");
+	private static final DecimalFormat ITEM_CODE_FORMAT = new DecimalFormat("0000");
+	
+
+	@Autowired
+	private ExchangeCodeMapper exchangeCodeMapper;
+	
+	@Autowired
+	private RedisTemplate<String, String> redisTemplate;
+
+	
+	/**
+	 * 获取兑换码批次列表
+	 * @param search
+	 * @param status
+	 * @param gid
+	 * @return
+	 */
+	public List<ExchangeCode> queryAllExchangeCode(String search, Integer status, Integer gid){
+		return exchangeCodeMapper.queryAllExchangeCode(search, status, gid);
+	}
+	
+	/**
+	 * 查询一个兑换码批次
+	 * @param id
+	 * @return
+	 */
+	public ExchangeCode queryOneExchangeCode(Integer id){
+		return exchangeCodeMapper.queryOneExchangeCode(id);
+	}
+	
+	/**
+	 * 创建兑换码批次
+	 * @param user 		创建用户
+	 * @param gid		商品ID
+	 * @param num	 	兑换码数量
+	 * @param remark	备注
+	 * @param endtime	兑换码有效截止日期
+	 */
+	@Transactional
+	public void createExchangeCode(UserBean user, Integer gid, Integer num, String remark, Integer endtime){
+		Integer now = ToolsUtil.getNow();
+		
+		ExchangeCode exchangeCode = new ExchangeCode();
+		exchangeCode.setCuid(user.getUserid());
+		exchangeCode.setCuname(user.getName());
+		exchangeCode.setGid(gid);
+		exchangeCode.setNum(num);
+		exchangeCode.setStatus(EXCHANGE_CODE_STATUS_OK);
+		exchangeCode.setRemark(remark);
+		exchangeCode.setEndtime(endtime);
+		exchangeCode.setCtime(now);
+		exchangeCode.setUtime(now);
+		exchangeCodeMapper.insertExchangeCode(exchangeCode);
+		Integer eid = exchangeCode.getId();
+		
+		String timeKey	   = ToolsUtil.formatTime(new Date(), ToolsUtil.getYYMMFormat());
+		String dayTimesKey = this.getTimesKey(timeKey);
+		Long dayTimesValue = redisTemplate.opsForValue().increment(dayTimesKey, INCREMENT_INIT_VALUE);
+		if (dayTimesValue.equals(INCREMENT_INIT_VALUE)){
+			redisTemplate.expire(dayTimesKey, 24 *3600, TimeUnit.SECONDS);
+		}
+		
+		List<ExchangeCodeItem> items = new ArrayList<>(Math.min(num, PAGE_SIZE));
+		for (int i = 1; i <= num; ++i){
+			ExchangeCodeItem item = new ExchangeCodeItem();
+			item.setEicode(this.getItemCode(timeKey, dayTimesValue, i));
+			item.setEid(eid);
+			item.setEipwd(this.randomPwd().toUpperCase());
+			item.setExtend("");
+			item.setStatus(0);
+			item.setUtime(0);
+			items.add(item);
+			
+			if (items.size() == PAGE_SIZE){
+				exchangeCodeMapper.insertExchangeCodeItems(items);
+				items.clear();
+			}
+		}
+		if (!items.isEmpty()){
+			exchangeCodeMapper.insertExchangeCodeItems(items);
+		}
+	}
+	
+	@Transactional
+	public Boolean update(ExchangeCode data, String remark, Integer status, Integer endtime){
+		data.setRemark(remark);
+		data.setStatus(status);
+		data.setEndtime(endtime);
+		if (exchangeCodeMapper.updateExchangeCode(data) != 1){
+			throw new ZSKKException(ErrorConstant.SERVER_ERROR);
+		}
+		return Boolean.TRUE;
+	}
+	
+	public List<ExchangeCodeItem> getItems(Integer eid, Integer status){
+		return exchangeCodeMapper.queryAllExchangeCodeItems(eid, status);
+	}
+	
+	private String getTimesKey(String timeKey){
+		return "SHOP_EXCHANGE_CODE_DAY_TIMES" + timeKey;
+	}
+
+	
+	public String getItemCode(String timeKey, Long dayTimes, Integer i){
+		if (i < 10000){
+			return timeKey + DAY_TIME_FORMAT.format(dayTimes) + ITEM_CODE_FORMAT.format(i);
+		}else{
+			return timeKey + DAY_TIME_FORMAT.format(dayTimes) + i;
+		}
+		
+	}
+	
+	public String randomPwd(){
+		return UUID.randomUUID().toString().substring(0, 6);
+	}
+	
+}

+ 20 - 0
shop/src/main/java/com/zskk/shop/utils/KeySerializer.java

@@ -0,0 +1,20 @@
+package com.zskk.shop.utils;
+
+import java.nio.charset.Charset;
+
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.data.redis.serializer.SerializationException;
+
+public class KeySerializer implements RedisSerializer<Object> {
+	private final Charset charset = Charset.forName("UTF8");
+	
+	@Override
+	public byte[] serialize(Object t) throws SerializationException {
+		return (t == null ? null : t.toString().getBytes(charset));
+	}
+
+	@Override
+	public String deserialize(byte[] bytes) throws SerializationException {
+		return (bytes == null ? null : new String(bytes, charset));
+	}
+}

+ 20 - 1
shop/src/main/java/com/zskk/shop/utils/ToolsUtil.java

@@ -2,6 +2,7 @@ package com.zskk.shop.utils;
 
 
 import java.text.ParseException;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
+import java.util.Calendar;
 import java.util.Date;
 import java.util.Date;
 
 
 import com.zskk.shop.exception.ErrorConstant;
 import com.zskk.shop.exception.ErrorConstant;
@@ -17,6 +18,15 @@ public class ToolsUtil {
 		return (int)(System.currentTimeMillis()/1000);
 		return (int)(System.currentTimeMillis()/1000);
 	}
 	}
 	
 	
+	/**
+	 * 获取当前年份
+	 * @return
+	 */
+	public static Integer getNowYear(){
+		Calendar now = Calendar.getInstance();
+		return now.get(Calendar.YEAR);
+	}
+	
 	/**
 	/**
 	 * 字符串转时间戳 秒单位
 	 * 字符串转时间戳 秒单位
 	 * @param time
 	 * @param time
@@ -63,10 +73,14 @@ public class ToolsUtil {
 	 * 微信对账单日期格式
 	 * 微信对账单日期格式
 	 * @return
 	 * @return
 	 */
 	 */
-	public static SimpleDateFormat getWxBillForamt(){
+	public static SimpleDateFormat getWxBillFormat(){
 		return new SimpleDateFormat("yyyyMMdd");
 		return new SimpleDateFormat("yyyyMMdd");
 	}
 	}
 	
 	
+	public static SimpleDateFormat getYYMMFormat(){
+		return new SimpleDateFormat("yyMM");
+	}
+	
 	public static SimpleDateFormat getYYYYMMDDHHMMSS(){
 	public static SimpleDateFormat getYYYYMMDDHHMMSS(){
 		return new SimpleDateFormat("yyyyMMddHHmmss");
 		return new SimpleDateFormat("yyyyMMddHHmmss");
 	}
 	}
@@ -89,4 +103,9 @@ public class ToolsUtil {
 		}
 		}
 		return (int)(format.parse(time).getTime()/1000);
 		return (int)(format.parse(time).getTime()/1000);
 	}
 	}
+	
+
+	public static void main(String[] args){
+		System.out.println(ToolsUtil.formatTime(new Date(), ToolsUtil.getYYMMFormat()));
+	}
 }
 }

+ 3 - 0
shop/src/main/resource/application-dev.properties

@@ -6,6 +6,9 @@ spring.datasource.password=ZSKK@2017~!@#
 spring.datasource.driverClassName=com.mysql.jdbc.Driver
 spring.datasource.driverClassName=com.mysql.jdbc.Driver
 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
 
 
+spring.redis.host=127.0.0.1
+spring.redis.port=6379
+
 zskk.myhost=http://shop.pacsonline.cn/
 zskk.myhost=http://shop.pacsonline.cn/
 zskk.shopmanagehost=http://localhost:8080/
 zskk.shopmanagehost=http://localhost:8080/
 zskk.secret=6244c0f6da164d4db51fdb27cff15c95
 zskk.secret=6244c0f6da164d4db51fdb27cff15c95

+ 3 - 0
shop/src/main/resource/application-test.properties

@@ -6,6 +6,9 @@ spring.datasource.password=ZSKK@2017~!@#
 spring.datasource.driverClassName=com.mysql.jdbc.Driver
 spring.datasource.driverClassName=com.mysql.jdbc.Driver
 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
 
 
+spring.redis.host=127.0.0.1
+spring.redis.port=6379
+
 zskk.myhost=http://testshop.pacsonline.cn/
 zskk.myhost=http://testshop.pacsonline.cn/
 zskk.shopmanagehost=http://testshopmanage.pacsonline.cn/
 zskk.shopmanagehost=http://testshopmanage.pacsonline.cn/
 zskk.secret=6244c0f6da164d4db51fdb27cff15c95
 zskk.secret=6244c0f6da164d4db51fdb27cff15c95

+ 4 - 1
shop/src/main/resource/mapper/ExchangeCodeMapper.xml

@@ -14,6 +14,9 @@
 		<if test="status != null">
 		<if test="status != null">
 			and status=#{status}
 			and status=#{status}
 		</if>
 		</if>
+		<if test="gid != null">
+			and gid=#{gid}
+		</if>
 		order by id desc
 		order by id desc
 	</select>
 	</select>
 	<select id="queryOneExchangeCode" resultType="com.zskk.shop.dao.entry.ExchangeCode">
 	<select id="queryOneExchangeCode" resultType="com.zskk.shop.dao.entry.ExchangeCode">
@@ -25,7 +28,7 @@
 		insert into exchange_code(cuid,cuname,gid,num,status,remark,endtime,ctime,utime)
 		insert into exchange_code(cuid,cuname,gid,num,status,remark,endtime,ctime,utime)
 		values(#{cuid}, #{cuname}, #{gid}, #{num}, #{status}, #{remark}, #{endtime}, #{ctime}, #{utime})
 		values(#{cuid}, #{cuname}, #{gid}, #{num}, #{status}, #{remark}, #{endtime}, #{ctime}, #{utime})
 	</insert>
 	</insert>
-	<update id="updateExchangeCode" parameterMap="com.zskk.shop.dao.entry.ExchangeCode">
+	<update id="updateExchangeCode" parameterType="com.zskk.shop.dao.entry.ExchangeCode">
 		update exchange_code set cuid=#{cuid}, cuname=#{cuname}, gid=#{gid}, num=#{num}, status=#{status}, 
 		update exchange_code set cuid=#{cuid}, cuname=#{cuname}, gid=#{gid}, num=#{num}, status=#{status}, 
 			remark=#{remark}, endtime=#{endtime}, ctime=#{ctime}, utime=#{utime}
 			remark=#{remark}, endtime=#{endtime}, ctime=#{ctime}, utime=#{utime}
 		where id=#{id}
 		where id=#{id}