Browse Source

第一次推送

lym 4 years ago
parent
commit
68644674db
33 changed files with 3443 additions and 0 deletions
  1. 201 0
      pom.xml
  2. 26 0
      src/main/java/com/hcloud/microservice/traced/TracedSourceWebApplication.java
  3. 42 0
      src/main/java/com/hcloud/microservice/traced/common/BaseInfoDO.java
  4. 112 0
      src/main/java/com/hcloud/microservice/traced/common/TracedBaseController.java
  5. 129 0
      src/main/java/com/hcloud/microservice/traced/components/WechatManagerComponent.java
  6. 233 0
      src/main/java/com/hcloud/microservice/traced/config/TracedWebMvcConfig.java
  7. 103 0
      src/main/java/com/hcloud/microservice/traced/config/WxMpConfiguration.java
  8. 41 0
      src/main/java/com/hcloud/microservice/traced/config/WxMpProperties.java
  9. 81 0
      src/main/java/com/hcloud/microservice/traced/wap/CodeInfoManageController.java
  10. 152 0
      src/main/java/com/hcloud/microservice/traced/wap/GoodsFeedbackManageController.java
  11. 126 0
      src/main/java/com/hcloud/microservice/traced/wap/WechatManagerController.java
  12. 51 0
      src/main/java/com/hcloud/microservice/traced/web/NormalController.java
  13. 207 0
      src/main/java/com/hcloud/microservice/traced/web/goodsmanager/GoodsBatchManageController.java
  14. 139 0
      src/main/java/com/hcloud/microservice/traced/web/goodsmanager/GoodsDealerManageController.java
  15. 221 0
      src/main/java/com/hcloud/microservice/traced/web/goodsmanager/GoodsFieldManageController.java
  16. 100 0
      src/main/java/com/hcloud/microservice/traced/web/goodsmanager/GoodsManageController.java
  17. 77 0
      src/main/java/com/hcloud/microservice/traced/web/goodsmanager/GoodsProInputsManagerController.java
  18. 81 0
      src/main/java/com/hcloud/microservice/traced/web/goodsmanager/GoodsProNormalManagerController.java
  19. 97 0
      src/main/java/com/hcloud/microservice/traced/web/goodsmanager/QRCodeInfoManageController.java
  20. 207 0
      src/main/java/com/hcloud/microservice/traced/web/goodsmanager/QRCodeRecordManageController.java
  21. 111 0
      src/main/java/com/hcloud/microservice/traced/web/sysmanager/AuthManagerController.java
  22. 224 0
      src/main/java/com/hcloud/microservice/traced/web/sysmanager/OrgManagerController.java
  23. 146 0
      src/main/java/com/hcloud/microservice/traced/web/sysmanager/RoleManagerController.java
  24. 228 0
      src/main/java/com/hcloud/microservice/traced/web/sysmanager/UserManagerController.java
  25. 69 0
      src/main/resources/application-dev.properties
  26. 64 0
      src/main/resources/application-pro.properties
  27. 60 0
      src/main/resources/application-test.properties
  28. 3 0
      src/main/resources/application.properties
  29. 0 0
      src/main/resources/excelMode/excelMode.xls
  30. 0 0
      src/main/resources/excelMode/nexExcelMode.xls
  31. 54 0
      src/main/resources/swagger-ui.html
  32. 16 0
      src/test/java/com/hcloud/microservice/traced/TracedSourceWebApplicationTests.java
  33. 42 0
      src/test/java/com/hcloud/microservice/traced/web/SysManagerControllerTest.java

+ 201 - 0
pom.xml

@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.hcloud.microserver</groupId>
+        <artifactId>common-parent</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+        <relativePath>../common-parent/pom.xml</relativePath>
+    </parent>
+    <groupId>com.hcloud.microserver</groupId>
+    <artifactId>traced-source-web</artifactId>
+    <version>${traced.source.web.version}</version>
+    <packaging>jar</packaging>
+
+    <name>traced-source-web</name>
+    <description>Demo project for Spring Boot</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.hcloud.microserver</groupId>
+              <artifactId>org-manage-client</artifactId>
+              <version>${org.managerclient.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.hcloud.microserver</groupId>
+            <artifactId>goods-manage-client</artifactId>
+            <version>${goods.managerclient.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-tomcat</artifactId>
+            <!--<scope>provided</scope>-->
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-eureka</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>spring-boot-starter-web</artifactId>
+                    <groupId>org.springframework.boot</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-thymeleaf</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-spring</artifactId>
+            <version>${shiro.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.crazycake</groupId>
+            <artifactId>shiro-redis</artifactId>
+            <version>2.4.2.1-RELEASE</version>
+        </dependency>
+    </dependencies>
+
+    <!-- <build>
+        <plugins>
+            打JAR包
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <configuration>
+                    不打包资源文件(配置文件和依赖包分开)
+                    <excludes>
+                        <exclude>*.**</exclude>
+                        <exclude>*/*.xml</exclude>
+                    </excludes>
+                    <archive>
+                        <manifest>
+                            <addClasspath>true</addClasspath>
+                            MANIFEST.MF 中 Class-Path 加入前缀
+                            <classpathPrefix>lib/</classpathPrefix>
+                            jar包不包含唯一版本标识
+                            <useUniqueVersions>false</useUniqueVersions>
+                            指定入口类
+                            <mainClass>com.hcloud.microservice.traced.TracedSourceWebApplication</mainClass>
+                        </manifest>
+                        <manifestEntries>
+                            MANIFEST.MF 中 Class-Path 加入资源文件目录
+                            <Class-Path>./resources/</Class-Path>
+                        </manifestEntries>
+                    </archive>
+                    <outputDirectory>${project.build.directory}</outputDirectory>
+                </configuration>
+            </plugin>
+
+            该插件的作用是用于复制依赖的jar包到指定的文件夹里
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy-dependencies</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>copy-dependencies</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>${project.build.directory}/lib/</outputDirectory>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+            该插件的作用是用于复制指定的文件
+            <plugin>
+                <artifactId>maven-resources-plugin</artifactId>
+                <executions>
+                    <execution> 复制配置文件
+                        <id>copy-resources</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>copy-resources</goal>
+                        </goals>
+                        <configuration>
+                            <resources>
+                                <resource>
+                                    <directory>src/main/resources</directory>
+                                    <includes>
+                                        <include>*.properties</include>
+                                    </includes>
+                                </resource>
+                            </resources>
+                            <outputDirectory>${project.build.directory}/resources</outputDirectory>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+            SpringBoot 打包插件,把 maven-jar-plugin 打成的jar包重新打成可运行jar包
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    重写包含依赖,包含不存在的依赖,jar里没有pom里的依赖
+                    <includes>
+                        <include>
+                            <groupId>null</groupId>
+                            <artifactId>null</artifactId>
+                        </include>
+                    </includes>
+                    <layout>ZIP</layout>
+                    使用外部配置文件,jar包里没有资源文件
+                    <addResources>true</addResources>
+                    <outputDirectory>${project.build.directory}/resources</outputDirectory>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                        <configuration>
+                            配置jar包特殊标识 配置后,保留原文件,生成新文件 *-run.jar
+                            配置jar包特殊标识 不配置,原文件命名为 *.jar.original,生成新文件 *.jar
+                            <classifier>run</classifier>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.18.1</version>
+                <configuration>
+                    <skipTests>true</skipTests>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build> -->
+	
+	<build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.18.1</version>
+                <configuration>
+                    <skipTests>true</skipTests>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+    
+</project>

+ 26 - 0
src/main/java/com/hcloud/microservice/traced/TracedSourceWebApplication.java

@@ -0,0 +1,26 @@
+package com.hcloud.microservice.traced;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.netflix.feign.EnableFeignClients;
+import org.springframework.context.annotation.ComponentScan;
+
+/**
+ * @author xiezt
+ */
+@EnableDiscoveryClient
+@EnableFeignClients("com.hcloud.microservice")
+@SpringBootApplication(scanBasePackages = "com.hcloud")
+@ComponentScan(basePackages = "com.hcloud")
+@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
+public class TracedSourceWebApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(TracedSourceWebApplication.class, args);
+    }
+
+}
+

+ 42 - 0
src/main/java/com/hcloud/microservice/traced/common/BaseInfoDO.java

@@ -0,0 +1,42 @@
+package com.hcloud.microservice.traced.common;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class BaseInfoDO implements Serializable {
+
+    private String fkProductGuid;
+
+    private String fkOrgGuid;
+
+    private Integer state;
+
+    private String createUser;
+
+    private Date createTime;
+
+    private String modifiedUser;
+
+    private Date modifiedTime;
+
+    private String orgBrevity;
+
+    private String ico;
+
+    private String codeUrlPrefix;
+
+    private String orgName;
+
+    private String orgCode;
+
+    private String orgAddress;
+
+    private String principals;
+
+    private String tel;
+
+    private String remark;
+}

+ 112 - 0
src/main/java/com/hcloud/microservice/traced/common/TracedBaseController.java

@@ -0,0 +1,112 @@
+package com.hcloud.microservice.traced.common;
+
+import com.hcloud.microserver.commoncore.base.BaseController;
+import com.hcloud.microserver.commoncore.base.ResultVO;
+import com.hcloud.microserver.commoncore.constant.GlobleConstant;
+import com.hcloud.microserver.commoncore.domain.FileDO;
+import com.hcloud.microserver.commoncore.enums.ResultEnum;
+import com.hcloud.microserver.commoncore.service.RedisUtils;
+import com.hcloud.microserver.commoncore.util.FileType;
+import com.hcloud.microserver.commoncore.util.FileUtil;
+import com.hcloud.microservice.org.facade.entity.BaseOrg;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * @author xiezt
+ */
+@Component
+public class TracedBaseController extends BaseController {
+
+    @Value("${img.location}")
+    private String UPLOAD_FILE_PATH;
+
+
+    @Autowired
+    private RedisUtils redisUtils;
+
+    protected String getUserId(){
+        String accessToke = this.getRequestObject().getHeader(ACCESS_TOKEN);
+        Map redisMap = (Map) redisUtils.getValue(accessToke);
+        if(null!=redisMap ){
+            return (String) redisMap.get(GlobleConstant.USER_GUID);
+        }
+        return null;
+    }
+
+    protected String getOrgGuid(){
+        String accessToke = this.getRequestObject().getHeader(ACCESS_TOKEN);
+        Map redisMap = (Map) redisUtils.getValue(accessToke);
+        if(null!=redisMap ){
+            return (String) redisMap.get(GlobleConstant.ORG_GUID);
+        }
+        return null;
+    }
+
+    protected Map getLoginInfo(){
+        String accessToke = this.getRequestObject().getHeader(ACCESS_TOKEN);
+        Map redisMap = (Map) redisUtils.getValue(accessToke);
+        if(null!=redisMap ){
+            return redisMap;
+        }
+        return null;
+    }
+
+    protected BaseInfoDO initiSaveObject(){
+        BaseInfoDO baseInfoDO = new BaseInfoDO();
+        String accessToke = this.getRequestObject().getHeader(ACCESS_TOKEN);
+        if(accessToke==null || "".equals(accessToke)){return null;}
+        Map redisMap = (Map) redisUtils.getValue(accessToke);
+        if(null!=redisMap){
+            BaseOrg baseOrg = (BaseOrg) redisMap.get(GlobleConstant.ORG_OBJECT);
+            String orgGuid = (String) redisMap.get(GlobleConstant.ORG_GUID);
+            String userId = (String) redisMap.get(GlobleConstant.USER_GUID);
+            baseInfoDO.setFkProductGuid(GlobleConstant.PRODUCT_GUID);
+            baseInfoDO.setState(1);
+            baseInfoDO.setFkOrgGuid(orgGuid);
+            baseInfoDO.setCreateUser(userId);
+            baseInfoDO.setModifiedUser(userId);
+            baseInfoDO.setCreateTime(new Date());
+            baseInfoDO.setModifiedTime(new Date());
+            baseInfoDO.setOrgBrevity(baseOrg.getOrgBrevity());
+            baseInfoDO.setIco(baseOrg.getIco());
+            baseInfoDO.setCodeUrlPrefix(baseOrg.getQrcodeUrlPrefixe());
+            baseInfoDO.setOrgName(baseOrg.getOrgName());
+            baseInfoDO.setOrgAddress(baseOrg.getOrgAddress());
+            baseInfoDO.setPrincipals(baseOrg.getPrincipals());
+            baseInfoDO.setTel(baseOrg.getTel());
+            baseInfoDO.setRemark(baseOrg.getRemark());
+            return baseInfoDO;
+        }
+        return null;
+    }
+
+    /**
+     * 更新代码
+     * @param file
+     * @return
+     */
+    public ResultVO uploadImageFiles(@RequestParam("file") MultipartFile file,String type){
+        String fileName = file.getOriginalFilename();
+        fileName = FileUtil.renameToUUID(fileName);
+        FileDO sysFile = new FileDO(FileType.fileType(fileName),fileName, new Date());
+        try {
+            String targetPath = UPLOAD_FILE_PATH;
+            if(null!=type && !"".equals(type)){
+                sysFile.setUrl(type+sysFile.getUrl());
+                targetPath=UPLOAD_FILE_PATH+type;
+            }
+            FileUtil.uploadFile(file.getBytes(),targetPath , fileName);
+        } catch (Exception e) {
+            return new ResultVO(ResultEnum.SYS_ERROR);
+        }
+        return success(sysFile.getUrl());
+    }
+}

+ 129 - 0
src/main/java/com/hcloud/microservice/traced/components/WechatManagerComponent.java

@@ -0,0 +1,129 @@
+package com.hcloud.microservice.traced.components;
+
+import com.hcloud.microserver.commoncore.base.ResultVO;
+import com.hcloud.microserver.commoncore.base.Token;
+import com.hcloud.microserver.commoncore.constant.GlobleConstant;
+import com.hcloud.microserver.commoncore.util.*;
+import com.hcloud.microserver.commoncore.util.string.StringUtils;
+import com.hcloud.microservice.goods.facade.clients.GoodsTracedUserManagerService;
+import com.hcloud.microservice.goods.facade.entity.GoodsTracedUser;
+import com.hcloud.microservice.goods.facade.forms.GoodsTracedUserForm;
+import com.hcloud.microservice.traced.common.BaseInfoDO;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.mp.bean.result.WxMpUser;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author xiezt
+ */
+@Slf4j
+@Component("wechatManager")
+public class WechatManagerComponent {
+
+    private static final String WECHAT_USER_INFO="wechatUserInfo";
+
+    @Autowired
+    private RedisTemplate redisTemplate;
+
+    @Autowired
+    private GoodsTracedUserManagerService goodsTracedUserManagerService;
+
+    public Map getWechatAccessToken(WxMpUser wxMpUser){
+        log.info("wxMpUser======================>{}",wxMpUser);
+        Map map = new HashMap();
+        if(null!=wxMpUser){
+        	//公众号只有在被绑定到微信开放平台帐号下后,才会获取UnionID。只要是同一个微信开放平台帐号下的公众号,用户的UnionID是唯一的
+        	String id = null;
+        	if(StringUtils.isEmpty(wxMpUser.getUnionId())) {
+        		id = wxMpUser.getOpenId();
+        	}else {
+        		id = wxMpUser.getUnionId();
+        	}
+        	
+        	if(getRedisUserCache(id,map)){
+                return map;
+            }
+            productAccessToken(wxMpUser,map);
+            return map;
+        }
+        log.info("没有获取到微信用户基本信息,请联系开发人员");
+        return null;
+    }
+
+    /**
+     * 缓存过期后的处理
+     * @param wxMpUser
+     * @param resultMap
+     */
+    private void productAccessToken(WxMpUser wxMpUser, Map resultMap){
+    	GoodsTracedUserForm form = new GoodsTracedUserForm();
+    	form.setTracedThirdCode(wxMpUser.getUnionId());
+    	form.setTracedUserOpenid(wxMpUser.getOpenId());
+        ResultVO resultVO = goodsTracedUserManagerService.searchTracedUserByCode(form);
+        if(resultVO.getCode()==0){
+            Map userMap = (Map) resultVO.getData();
+            GoodsTracedUserForm tracedUserForm = JavaBeanUtils.mapToEntity(userMap,GoodsTracedUserForm.class);
+            log.info("tracedUserForm======================>{}",tracedUserForm);
+            String key = wxMpUser.getUnionId();
+        	if(StringUtils.isEmpty(key)) {
+        		key = wxMpUser.getOpenId();
+        	}
+        	log.info("用户key======================>{}",key);
+            if(null!=tracedUserForm.getGuid() && !"".equals(tracedUserForm.getGuid())){
+                ValueOperations<String, Object> operations = redisTemplate.opsForValue();
+                resultMap.put(WECHAT_USER_INFO,tracedUserForm);
+                operations.set(key,tracedUserForm,GlobleConstant.TOKEN_EXPIRES_SECOND,TimeUnit.SECONDS);
+            }else{
+                GoodsTracedUserForm tuser = new GoodsTracedUserForm();
+                tuser.setGuid(UUIDUtils.randomUUID());
+                tuser.setTracedUserOpenid(wxMpUser.getOpenId());
+                tuser.setTracedThirdCode(wxMpUser.getUnionId());
+                tuser.setTracedSex(wxMpUser.getSex());
+                tuser.setTracedUserImg(wxMpUser.getHeadImgUrl());
+                tuser.setTracedUserName(wxMpUser.getNickname());
+                tuser.setState(1);
+                tuser.setCreateTime(new Date());
+                tuser.setModifiedTime(new Date());
+                ResultVO innerVO = goodsTracedUserManagerService.saveTracedUser(tuser);
+                if(innerVO.getCode()==0){
+                    ValueOperations<String, Object> operations = redisTemplate.opsForValue();
+                    resultMap.put(WECHAT_USER_INFO,tuser);
+                    operations.set(key,tuser,GlobleConstant.TOKEN_EXPIRES_SECOND,TimeUnit.SECONDS);
+                }
+                log.info("GoodsTracedUserForm======================>{}",tuser);
+            }
+        }
+    }
+
+
+    /**
+     * 缓存未过期的处理
+     * @param openid
+     * @param resultMap
+     * @return
+     */
+    private boolean getRedisUserCache(String unionId,Map resultMap){
+        if(null!=unionId && !"".equals(unionId)){
+            Object obj = redisTemplate.opsForValue().get(unionId);
+            log.info("obj========================>{}",obj);
+            if(obj!=null){
+                ValueOperations<String, Object> operations = redisTemplate.opsForValue();
+                GoodsTracedUserForm comp = (GoodsTracedUserForm) obj;
+                resultMap.put(WECHAT_USER_INFO,comp);
+                operations.set(comp.getTracedThirdCode(),comp,GlobleConstant.ACCESS_TOKEN_EXPIRES_SECOND,TimeUnit.SECONDS);
+                return Boolean.TRUE;
+            }
+        }
+        return Boolean.FALSE;
+    }
+}

+ 233 - 0
src/main/java/com/hcloud/microservice/traced/config/TracedWebMvcConfig.java

@@ -0,0 +1,233 @@
+package com.hcloud.microservice.traced.config;
+
+import com.hcloud.microserver.commoncore.conf.CurrentUserMethodArgumentResolver;
+import com.hcloud.microserver.commoncore.interceptor.AuthenticationAdvancedInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.format.FormatterRegistry;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.validation.MessageCodesResolver;
+import org.springframework.validation.Validator;
+import org.springframework.web.method.support.HandlerMethodArgumentResolver;
+import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
+import org.springframework.web.servlet.HandlerExceptionResolver;
+import org.springframework.web.servlet.View;
+import org.springframework.web.servlet.config.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author xiezt
+ */
+@Configuration
+public class TracedWebMvcConfig implements WebMvcConfigurer {
+    @Override
+    public void configurePathMatch(PathMatchConfigurer configurer) {
+
+    }
+
+    /**
+     * Configure content negotiation options.
+     *
+     * @param configurer
+     */
+    @Override
+    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
+
+    }
+
+    /**
+     * Configure asynchronous request handling options.
+     *
+     * @param configurer
+     */
+    @Override
+    public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
+
+    }
+
+    /**
+     * Configure a handler to delegate unhandled requests by forwarding to the
+     * Servlet container's "default" servlet. A common use case for this is when
+     * Servlet container's default handling of static resources.
+     *
+     * @param configurer
+     */
+    @Override
+    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
+
+    }
+
+    /**
+     * registered by default.
+     *
+     * @param registry
+     */
+    @Override
+    public void addFormatters(FormatterRegistry registry) {
+
+    }
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(authenticationInterceptor())
+                .addPathPatterns("/**")
+                .excludePathPatterns(new String[]{"/public/**","/static/**",
+                        "/resouces/**","/images/**","/swagger-resources/**","/v2/api-docs/**"});
+    }
+
+    /**
+     * Add handlers to serve static resources such as images, js, and, css
+     * files from specific locations under web application root, the classpath,
+     * and others.
+     *
+     * @param registry
+     */
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+
+    }
+
+    /**
+     * Configure cross origin requests processing.
+     *
+     * @param registry
+     * @since 4.2
+     */
+    @Override
+    public void addCorsMappings(CorsRegistry registry) {
+
+    }
+
+
+    @Override
+    public void addViewControllers(ViewControllerRegistry registry) {
+
+    }
+
+    /**
+     * Configure view resolvers to translate String-based view names returned from
+     * controllers into concrete {@link View}
+     * implementations to perform rendering with.
+     *
+     * @param registry
+     * @since 4.1
+     */
+    @Override
+    public void configureViewResolvers(ViewResolverRegistry registry) {
+
+    }
+
+    @Override
+    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
+        argumentResolvers.add(currentUserMethodArgumentResolver());
+    }
+
+    /**
+     * Add handlers to support custom controller method return value types.
+     * <p>Using this option does not override the built-in support for handling
+     * return values. To customize the built-in support for handling return
+     * values, configure RequestMappingHandlerAdapter directly.
+     *
+     * @param returnValueHandlers initially an empty list
+     */
+    @Override
+    public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {
+
+    }
+
+    /**
+     * Configure the {@link HttpMessageConverter}s to use for reading or writing
+     * to the body of the request or response. If no converters are added, a
+     * default list of converters is registered.
+     * <p><strong>Note</strong> that adding converters to the list, turns off
+     * default converter registration. To simply add a converter without impacting
+     * default registration, consider using the method
+     * {@link #extendMessageConverters(List)} instead.
+     *
+     * @param converters initially an empty list of converters
+     */
+    @Override
+    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
+
+    }
+
+    /**
+     * A hook for extending or modifying the list of converters after it has been
+     * configured. This may be useful for example to allow default converters to
+     * be registered and then insert a custom converter through this method.
+     *
+     * @param converters the list of configured converters to extend.
+     * @since 4.1.3
+     */
+    @Override
+    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
+
+    }
+
+    /**
+     * Configure exception resolvers.
+     * <p>The given list starts out empty. If it is left empty, the framework
+     * configures a default set of resolvers, see
+     * {@link WebMvcConfigurationSupport#addDefaultHandlerExceptionResolvers(List)}.
+     * Or if any exception resolvers are added to the list, then the application
+     * effectively takes over and must provide, fully initialized, exception
+     * resolvers.
+     * <p>Alternatively you can use
+     * {@link #extendHandlerExceptionResolvers(List)} which allows you to extend
+     * or modify the list of exception resolvers configured by default.
+     *
+     * @param exceptionResolvers initially an empty list
+     * @see #extendHandlerExceptionResolvers(List)
+     * @see WebMvcConfigurationSupport#addDefaultHandlerExceptionResolvers(List)
+     */
+    @Override
+    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
+
+    }
+
+    /**
+     * Extending or modify the list of exception resolvers configured by default.
+     * This can be useful for inserting a custom exception resolver without
+     * interfering with default ones.
+     *
+     * @param exceptionResolvers the list of configured resolvers to extend
+     * @see WebMvcConfigurationSupport#addDefaultHandlerExceptionResolvers(List)
+     * @since 4.3
+     */
+    @Override
+    public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
+
+    }
+
+    /**
+     * Provide a custom {@link Validator} instead of the one created by default.
+     * The default implementation, assuming JSR-303 is on the classpath, is:
+     * Leave the return value as {@code null} to keep the default.
+     */
+    @Override
+    public Validator getValidator() {
+        return null;
+    }
+
+    /**
+     * Provide a custom {@link MessageCodesResolver} for building message codes
+     * from data binding and validation error codes. Leave the return value as
+     * {@code null} to keep the default.
+     */
+    @Override
+    public MessageCodesResolver getMessageCodesResolver() {
+        return null;
+    }
+
+
+    @Bean
+    public CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver() {
+        return new CurrentUserMethodArgumentResolver();
+    }
+
+    @Bean
+    public AuthenticationAdvancedInterceptor authenticationInterceptor() {
+        return new AuthenticationAdvancedInterceptor();
+    }
+}

+ 103 - 0
src/main/java/com/hcloud/microservice/traced/config/WxMpConfiguration.java

@@ -0,0 +1,103 @@
+package com.hcloud.microservice.traced.config;
+
+
+import com.google.common.collect.Maps;
+import com.hcloud.microserver.commoncore.handler.*;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
+import me.chanjar.weixin.mp.api.WxMpMessageRouter;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
+import me.chanjar.weixin.mp.constant.WxMpEventConstants;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Map;
+
+import static me.chanjar.weixin.common.api.WxConsts.*;
+
+/**
+ * wechat mp configuration
+ *
+ * @author Binary Wang(https://github.com/binarywang)
+ */
+@Slf4j
+@Configuration
+public class WxMpConfiguration {
+
+    private LogHandler logHandler;
+    private NullHandler nullHandler;
+    private KfSessionHandler kfSessionHandler;
+    private StoreCheckNotifyHandler storeCheckNotifyHandler;
+    private LocationHandler locationHandler;
+    private MenuHandler menuHandler;
+    private MsgHandler msgHandler;
+    private UnsubscribeHandler unsubscribeHandler;
+    private SubscribeHandler subscribeHandler;
+
+    /**
+     * 设置微信公众号的appid
+     */
+    @Value("${wx.mp.appId}")
+    private String appId;
+
+    /**
+     * 设置微信公众号的app secret
+     */
+    @Value("${wx.mp.secret}")
+    private String secret;
+
+    /**
+     * 设置微信公众号的token
+     */
+    @Value("${wx.mp.token}")
+    private String token;
+
+    /**
+     * 设置微信公众号的EncodingAESKey
+     */
+    @Value("${wx.mp.aesKey}")
+    private String aesKey;
+
+    private static Map<String, WxMpMessageRouter> routers = Maps.newHashMap();
+    private static Map<String, WxMpService> mpServices = Maps.newHashMap();
+
+    @Autowired
+    public WxMpConfiguration(LogHandler logHandler, NullHandler nullHandler, KfSessionHandler kfSessionHandler,
+                             StoreCheckNotifyHandler storeCheckNotifyHandler, LocationHandler locationHandler,
+                             MenuHandler menuHandler, MsgHandler msgHandler, UnsubscribeHandler unsubscribeHandler,
+                             SubscribeHandler subscribeHandler) {
+        this.logHandler = logHandler;
+        this.nullHandler = nullHandler;
+        this.kfSessionHandler = kfSessionHandler;
+        this.storeCheckNotifyHandler = storeCheckNotifyHandler;
+        this.locationHandler = locationHandler;
+        this.menuHandler = menuHandler;
+        this.msgHandler = msgHandler;
+        this.unsubscribeHandler = unsubscribeHandler;
+        this.subscribeHandler = subscribeHandler;
+    }
+
+    public static Map<String, WxMpMessageRouter> getRouters() {
+        return routers;
+    }
+
+    public static Map<String, WxMpService> getMpServices() {
+        return mpServices;
+    }
+
+    @Bean
+    public Object services() {
+        WxMpInMemoryConfigStorage configStorage = new WxMpInMemoryConfigStorage();
+        configStorage.setAppId(appId);
+        configStorage.setSecret(secret);
+        configStorage.setToken(token);
+        configStorage.setAesKey(aesKey);
+        WxMpService service = new WxMpServiceImpl();
+        service.setWxMpConfigStorage(configStorage);
+        mpServices.put(configStorage.getAppId(),service);
+        return Boolean.TRUE;
+    }
+}

+ 41 - 0
src/main/java/com/hcloud/microservice/traced/config/WxMpProperties.java

@@ -0,0 +1,41 @@
+package com.hcloud.microservice.traced.config;
+
+
+import com.hcloud.microserver.commoncore.util.JsonUtils;
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+
+/**
+ * @author xiezt
+ */
+@Data
+@ConfigurationProperties(prefix = "wx.mp")
+@Component
+public class WxMpProperties {
+    /**
+     * 设置微信公众号的appid
+     */
+    private String appId;
+
+    /**
+     * 设置微信公众号的app secret
+     */
+    private String secret;
+
+    /**
+     * 设置微信公众号的token
+     */
+    private String token;
+
+    /**
+     * 设置微信公众号的EncodingAESKey
+     */
+    private String aesKey;
+
+    @Override
+    public String toString() {
+        return JsonUtils.toJson(this);
+    }
+}

+ 81 - 0
src/main/java/com/hcloud/microservice/traced/wap/CodeInfoManageController.java

@@ -0,0 +1,81 @@
+package com.hcloud.microservice.traced.wap;
+
+import com.hcloud.microserver.commoncore.annotation.AuthOrgValidate;
+import com.hcloud.microserver.commoncore.base.ResponseBase;
+import com.hcloud.microserver.commoncore.base.ResultVO;
+import com.hcloud.microservice.goods.facade.clients.GoodsBatchManagerService;
+import com.hcloud.microservice.goods.facade.clients.GoodsQRCodeManagerService;
+import com.hcloud.microservice.goods.facade.forms.GoodsBatchInfoForm;
+import com.hcloud.microservice.traced.common.TracedBaseController;
+import io.swagger.annotations.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author xiezt
+ */
+@Slf4j
+@RestController
+@RequestMapping("/app/code")
+@Api(description = "wap端处理溯源码服务",tags = {"wapCodeService"})
+public class CodeInfoManageController extends TracedBaseController {
+
+    @Autowired
+    private GoodsQRCodeManagerService goodsQRCodeManagerService;
+
+    @Autowired
+    private GoodsBatchManagerService goodsBatchManagerService;
+
+    @ApiOperation(value = "扫描溯源二维码",notes = "通过溯源加密码查询溯源码信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "qrToken",value = "溯源加密码", dataType = "String",paramType = "query")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate
+    @GetMapping("/scanCode")
+    public ResponseBase scanQRCodeInfo(@RequestParam("qrToken") String qrToken){
+        ResultVO resultVO = goodsQRCodeManagerService.searchGoodsQRCodeInfoByTokenStr(qrToken);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "保存评价信息",notes = "保存评价信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "goodsBatchInfoForm",value = "评价信息", dataType = "GoodsBatchInfoForm")
+    })
+    @ApiResponse(code =0,message = "保存成功")
+    @AuthOrgValidate
+    @PostMapping("/saveFeedback")
+    public ResponseBase saveFeedbackInfo(@RequestBody GoodsBatchInfoForm goodsBatchInfoForm){
+        ResultVO resultVO = goodsBatchManagerService.saveAllFeedbackInfo(goodsBatchInfoForm);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "查询评价信息",notes = "查询评价信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "userId",value = "用户Id", dataType = "String"),
+            @ApiImplicitParam(name = "batchId",value = "商品批次ID", dataType = "String")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate
+    @GetMapping("/getFeedback")
+    public ResponseBase searchFeedbackInfo(@RequestParam("userId") String userId,
+                                           @RequestParam("batchId") String batchId){
+        ResultVO resultVO = goodsBatchManagerService.searchAllFeedbackInfo(batchId,userId);
+        return responseSuccess(resultVO);
+    }
+
+
+    @ApiOperation(value = "查询溯源码信息",notes = "通过溯源码加密字符,查询溯源码信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "qrToken",value = "溯源码加密字符",dataType = "String",paramType = "query")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate
+    @GetMapping("/detail")
+    public ResponseBase getQRCodeInfo(@RequestParam("qrToken") String qrToken){
+        ResultVO resultVO = goodsQRCodeManagerService.getGoodsQRCodeDetailInfoByToken(qrToken);
+        return responseSuccess(resultVO);
+    }
+
+}

+ 152 - 0
src/main/java/com/hcloud/microservice/traced/wap/GoodsFeedbackManageController.java

@@ -0,0 +1,152 @@
+package com.hcloud.microservice.traced.wap;
+
+import com.hcloud.microserver.commoncore.annotation.AuthOrgValidate;
+import com.hcloud.microserver.commoncore.base.ResponseBase;
+import com.hcloud.microserver.commoncore.base.ResultVO;
+import com.hcloud.microserver.commoncore.enums.OrgAuthEnum;
+import com.hcloud.microservice.goods.facade.clients.GoodsBatchGradeManagerService;
+import com.hcloud.microservice.goods.facade.clients.GoodsFeedbackManagerService;
+import com.hcloud.microservice.goods.facade.forms.GoodsBatchFeedbackForm;
+import com.hcloud.microservice.goods.facade.forms.GoodsBatchGradeForm;
+import com.hcloud.microservice.traced.common.TracedBaseController;
+import io.swagger.annotations.*;
+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;
+
+/**
+ * @author xiezt
+ */
+@RestController
+@Api(description = "评价服务")
+public class GoodsFeedbackManageController extends TracedBaseController {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(GoodsFeedbackManageController.class);
+
+    @Autowired
+    private GoodsFeedbackManagerService goodsFeedbackManagerService;
+
+    @Autowired
+    private GoodsBatchGradeManagerService goodsBatchGradeManagerService;
+
+
+    @ApiOperation(value = "分页查询评价信息",notes = "分页查询商品评价信息,默认分页条数10条")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "goodsBatchFeedbackForm",value = "查询条件",dataType = "GoodsBatchFeedbackForm")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_ORG_EXTENDS)
+    @PostMapping("/web/feedback/searchByPage")
+    public ResponseBase searchFeedbackByPage(@RequestBody GoodsBatchFeedbackForm goodsBatchFeedbackForm){
+        // 获取用户id
+        String orgGuid = this.getOrgGuid();
+        LOGGER.info("当前用户机构guid=============>{}", orgGuid);
+        goodsBatchFeedbackForm.setFkOrgGuid(orgGuid);
+        ResultVO resultVO = goodsFeedbackManagerService.searchGoodsFeedbackByPage(goodsBatchFeedbackForm);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "分页查询评级信息",notes = "分页查询商品评级信息,默认分页条数10条")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "gradeForm",value = "查询条件",dataType = "GoodsBatchGradeForm")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_ORG_EXTENDS)
+    @PostMapping("/web/grade/searchByPage")
+    public ResponseBase searchBatchGradeByPage(@RequestBody GoodsBatchGradeForm gradeForm){
+        ResultVO resultVO = goodsBatchGradeManagerService.searchBatchGradeByPage(gradeForm);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "通过溯源用户查询商品评价信息",notes = "通过溯源用户查询商品评价信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "userId",value = "用户ID",dataType = "String",paramType = "query"),
+            @ApiImplicitParam(name = "batchId",value = "商品批次Id",dataType = "String",paramType = "query"),
+            @ApiImplicitParam(name = "fkBatchRecordGuid",value = "溯源码Id",dataType = "String",paramType = "query")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate
+    @GetMapping("/wap/feedback/searchByUid")
+    public ResponseBase searchFeedbackByUid(@RequestParam("userId") String userId,
+                                            @RequestParam("batchId") String batchId,
+                                            @RequestParam("fkBatchRecordGuid") String fkBatchRecordGuid){
+        ResultVO resultVO = goodsFeedbackManagerService.getGoodsFeedbackByUserId(userId,fkBatchRecordGuid);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "通过溯源用户查询商品评级信息",notes = "通过溯源用户查询商品评级信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "userId",value = "用户ID",dataType = "String",paramType = "query"),
+            @ApiImplicitParam(name = "batchId",value = "商品批次Id",dataType = "String",paramType = "query"),
+            @ApiImplicitParam(name = "fkBatchRecordGuid",value = "溯源码Id",dataType = "String",paramType = "query")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate
+    @GetMapping("/wap/grade/searchByUid")
+    public ResponseBase searchGradeByUid(@RequestParam("userId") String userId,
+                                         @RequestParam("batchId") String batchId,
+                                         @RequestParam("fkBatchRecordGuid") String fkBatchRecordGuid){
+        ResultVO resultVO = goodsBatchGradeManagerService.getBatchGradeByUserId(userId,fkBatchRecordGuid);
+        return responseSuccess(resultVO);
+    }
+
+
+    @ApiOperation(value = "保存商品评价信息",notes = "保存用户评价信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "feedbackForm",value = "评价内容",dataType = "GoodsBatchFeedbackForm")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate
+    @PostMapping("/wap/feedback/save")
+    public ResponseBase saveFeedbackInfo(@RequestBody GoodsBatchFeedbackForm feedbackForm){
+        feedbackForm.setState(1);
+        feedbackForm.setCreateTime(new Date());
+        feedbackForm.setModifiedTime(new Date());
+        ResultVO resultVO =  goodsFeedbackManagerService.saveGoodsFeedbackInfo(feedbackForm);
+        return responseSuccess(resultVO);
+
+    }
+
+    @ApiOperation(value = "保存商品评级信息",notes = "保存用户评级信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "gradeForm",value = "评级信息",dataType = "GoodsBatchGradeForm")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate
+    @PostMapping("/wap/grade/save")
+    public ResponseBase saveGradeInfo(@RequestBody GoodsBatchGradeForm gradeForm){
+        gradeForm.setState(1);
+        gradeForm.setCreateTime(new Date());
+        gradeForm.setModifiedTime(new Date());
+        ResultVO resultVO = goodsBatchGradeManagerService.saveBatchGradeInfo(gradeForm);
+        return responseSuccess(resultVO);
+    }
+
+
+    @ApiOperation(value = "批量删除商品用户评级信息",notes = "批量删除商品用户评级信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "gradeForm",value = "查询条件",dataType = "GoodsBatchGradeForm")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_ORG_EXTENDS)
+    @PostMapping("/web/grade/batchDel")
+    public ResponseBase delGradeInfo(@RequestBody GoodsBatchGradeForm gradeForm){
+        ResultVO resultVO = goodsBatchGradeManagerService.delBatchGradeInfo(gradeForm);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "批量删除商品用户评价信息",notes = "批量删除商品用户评价信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "feedbackForm",value = "查询条件",dataType = "GoodsBatchFeedbackForm")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_ORG_EXTENDS)
+    @PostMapping("/web/feedback/batchDel")
+    public ResponseBase delFeedbackInfo(@RequestBody GoodsBatchFeedbackForm feedbackForm){
+        ResultVO resultVO = goodsFeedbackManagerService.delGoodsFeedbackInfo(feedbackForm);
+        return responseSuccess(resultVO);
+    }
+}

+ 126 - 0
src/main/java/com/hcloud/microservice/traced/wap/WechatManagerController.java

@@ -0,0 +1,126 @@
+package com.hcloud.microservice.traced.wap;
+
+import com.hcloud.microserver.commoncore.annotation.AuthOrgValidate;
+import com.hcloud.microserver.commoncore.base.ResponseBase;
+import com.hcloud.microserver.commoncore.base.ResultVO;
+import com.hcloud.microserver.commoncore.enums.ResultEnum;
+import com.hcloud.microservice.goods.facade.forms.GoodsTracedUserForm;
+import com.hcloud.microservice.traced.common.TracedBaseController;
+import com.hcloud.microservice.traced.components.WechatManagerComponent;
+import com.hcloud.microservice.traced.config.WxMpConfiguration;
+import io.swagger.annotations.*;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.bean.WxJsapiSignature;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.http.URIUtil;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
+import me.chanjar.weixin.mp.bean.result.WxMpUser;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+
+/**
+ * @author xiezt
+ */
+@Slf4j
+@RestController
+@RequestMapping("/wap/wechat")
+@Api(description = "微信api服务")
+public class WechatManagerController extends TracedBaseController {
+
+    private static final String WECHAT_AUTH_SCOPE="snsapi_userinfo";
+
+    private static final String WECHAT_USER_INFO="wechatUserInfo";
+
+    @Value("${wx.mp.appId}")
+    private String appid;
+
+    @Value("${wx.auth.redirecturl}")
+    private String wechatRedirectUrl;
+
+    private String wechatForwardUrl;
+
+    @Autowired
+    private WechatManagerComponent wechatManager;
+
+    @ApiOperation(value = "微信登录",notes = "微信登录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "furl",value = "回调微信url", dataType = "String",paramType = "query")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @GetMapping("/login")
+    @AuthOrgValidate
+    public void login(@RequestParam("furl") String furl){
+        wechatForwardUrl = furl;
+        log.info("appid is ================>{}",appid);
+        final WxMpService wxMpService = WxMpConfiguration.getMpServices().get(appid);
+        String authUrls= wxMpService.oauth2buildAuthorizationUrl(wechatRedirectUrl,WECHAT_AUTH_SCOPE,URIUtil.encodeURIComponent(wechatForwardUrl));
+        try {
+            log.info("authUrls===============>{}",authUrls);
+            this.getResponseObject().sendRedirect(authUrls);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("请求微信权限地址错误请检查配置参数,配置的url:{}",authUrls);
+        }
+    }
+
+
+    @ApiOperation(value = "获取用户数据库id",notes = "微信回调接口请勿直接请求")
+    @ApiResponse(code =500,message = "请求的配置参数有问题")
+    @GetMapping("/doLogin")
+    @AuthOrgValidate
+    public void doLogin(@RequestParam("code") String code){
+        if(null!=code && !"".equals(code)){
+            log.info("微信权限认证code是====================>{}",code);
+           final WxMpService wxMpService = WxMpConfiguration.getMpServices().get(appid);
+            try {
+                WxMpOAuth2AccessToken accessToken = wxMpService.oauth2getAccessToken(code);
+                if(accessToken!=null ){
+                  log.info("accessToken object is:{}",accessToken);
+                  WxMpUser wxMpUser = wxMpService.oauth2getUserInfo(accessToken,"");
+                  log.info("wxMpUser object is:{}",wxMpUser);
+                  Map map = wechatManager.getWechatAccessToken(wxMpUser);
+                  if(null!=map && map.size()>0){
+                      GoodsTracedUserForm tracedUserForm = (GoodsTracedUserForm) map.get(WECHAT_USER_INFO);
+                      log.info("redirectUrl======================>{}",wechatForwardUrl+"?userId="+tracedUserForm.getGuid());
+                      this.getResponseObject().sendRedirect(wechatForwardUrl+"?userId="+tracedUserForm.getGuid());
+                  }else {
+                      this.getResponseObject().sendRedirect(wechatForwardUrl);
+                  }
+                }
+            } catch (Exception e) {
+                log.error("微信参数错误,请查看参数配置谢谢");
+                e.printStackTrace();
+            }
+        }
+    }
+    
+    /*微信js签名接口*/
+    @ApiOperation(value = "微信js签名接口",notes = "微信js签名接口")
+    @GetMapping("/getJsapiTicket")
+    @AuthOrgValidate
+    public ResponseBase getJsapiTicket(String url) {
+    	WxJsapiSignature jsapiSignature = null;
+        ResultVO resultVO = new ResultVO();
+        try {
+        	//WxMpService wxMpService = context.getBean(WxMpService.class);
+        	final WxMpService wxMpService = WxMpConfiguration.getMpServices().get(appid);
+            jsapiSignature = wxMpService.createJsapiSignature(url);
+            resultVO.setCode(ResultEnum.SUCCESS.getCode());
+            resultVO.setData(jsapiSignature);
+        } catch (WxErrorException e) {
+            e.printStackTrace();
+            System.err.print(e.getError());
+            resultVO.setCode(ResultEnum.FAILURE.getCode());
+            resultVO.setData("微信js签名失败");
+        }
+        return responseSuccess(resultVO);
+    }
+}

+ 51 - 0
src/main/java/com/hcloud/microservice/traced/web/NormalController.java

@@ -0,0 +1,51 @@
+package com.hcloud.microservice.traced.web;
+
+import com.hcloud.microserver.commoncore.annotation.AuthOrgValidate;
+import com.hcloud.microserver.commoncore.annotation.AuthValidate;
+import com.hcloud.microserver.commoncore.base.ResponseBase;
+import com.hcloud.microserver.commoncore.base.ResultVO;
+import com.hcloud.microservice.traced.common.TracedBaseController;
+import io.swagger.annotations.*;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @author xiezt
+ */
+@RestController
+@RequestMapping("/web/normal")
+@Api(description = "公共操作服务")
+public class NormalController extends TracedBaseController {
+
+    private static final String TARGET_IMAGE_DIC_NAME="images/";
+    private static final String TARGET_FILE_DIC_NAME="files/";
+
+    @ApiOperation(value = "图片上传",notes = "上传问题图片,图片限制大小10MB")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "file",value = "上传内容",dataType = "MultipartFile")
+    })
+    @ApiResponse(code = 0,message = "操作成功")
+    @AuthOrgValidate
+    @PostMapping("/uploadPics")
+    public ResponseBase uploadPics(@RequestParam("file") MultipartFile file, HttpServletRequest request){
+        ResultVO resultVO = this.uploadImageFiles(file,TARGET_IMAGE_DIC_NAME);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "文件上传",notes = "上传文件,文件限制大小10MB")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "file",value = "上传内容",dataType = "MultipartFile")
+    })
+    @ApiResponse(code = 0,message = "操作成功")
+    @AuthOrgValidate
+    @PostMapping("/uploadFiles")
+    public ResponseBase uploadFiles(@RequestParam("file") MultipartFile file, HttpServletRequest request){
+        ResultVO resultVO = this.uploadImageFiles(file,TARGET_FILE_DIC_NAME);
+        return responseSuccess(resultVO);
+    }
+}

+ 207 - 0
src/main/java/com/hcloud/microservice/traced/web/goodsmanager/GoodsBatchManageController.java

@@ -0,0 +1,207 @@
+package com.hcloud.microservice.traced.web.goodsmanager;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.hcloud.microserver.commoncore.annotation.AuthOrgValidate;
+import com.hcloud.microserver.commoncore.annotation.AuthValidate;
+import com.hcloud.microserver.commoncore.base.ResponseBase;
+import com.hcloud.microserver.commoncore.base.ResultVO;
+import com.hcloud.microserver.commoncore.enums.OrgAuthEnum;
+import com.hcloud.microserver.commoncore.enums.ResultEnum;
+import com.hcloud.microserver.commoncore.util.BeanCopyUtil;
+import com.hcloud.microserver.commoncore.util.DateUtils;
+import com.hcloud.microserver.commoncore.util.EasyHttpUtils;
+import com.hcloud.microservice.goods.facade.clients.GoodsBatchManagerService;
+import com.hcloud.microservice.goods.facade.entity.GoodsInterAuxiliary;
+import com.hcloud.microservice.goods.facade.forms.GoodsBatchInfoForm;
+import com.hcloud.microservice.traced.common.BaseInfoDO;
+import com.hcloud.microservice.traced.common.TracedBaseController;
+import io.swagger.annotations.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author xiezt
+ */
+@RestController
+@RequestMapping("/web/goods/batch")
+@Api(description = "商品批次服务")
+public class GoodsBatchManageController extends TracedBaseController {
+
+    public static final Integer ONEC_MAX_QR_COUNT=10000;
+
+    @Autowired
+    private GoodsBatchManagerService goodsBatchManagerService;
+    
+    @Value("${wlw.address}")
+    private String wlwhost;
+
+    @ApiOperation(value = "查询商品批次记录信息",notes = "分页查询商品批次记录信息,默认分页条数10条")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "goodsBatchInfoForm",value = "查询条件",dataType = "GoodsInfoForm")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_BATCH_QUERY)
+    @PostMapping("/searchByPage")
+    public ResponseBase searchByPage(@RequestBody GoodsBatchInfoForm goodsBatchInfoForm){
+        BaseInfoDO infoDO = this.initiSaveObject();
+        if(infoDO==null){return responseError(new ResultVO(ResultEnum.TOKEN_EXPIRED));}
+        BeanCopyUtil.copyBean(infoDO,goodsBatchInfoForm);
+        ResultVO resultVO = goodsBatchManagerService.queryGoodsBatchRecordByPage(goodsBatchInfoForm);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "添加商品批次记录信息",notes = "通过商品批次基本信息,添加商品批次记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "goodsBatchInfoForm",value = "商品批次基本信息",dataType = "GoodsBatchInfoForm")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_BATCH_ADD)
+    @PostMapping("/add")
+    public ResponseBase addGoodsBatchInfo(@RequestBody GoodsBatchInfoForm goodsBatchInfoForm){
+        BaseInfoDO baseInfoDO = this.initiSaveObject();
+        if(baseInfoDO==null){
+           return responseError(new ResultVO(ResultEnum.TOKEN_EXPIRED));
+        }
+        BeanCopyUtil.copyBean(baseInfoDO,goodsBatchInfoForm);
+        goodsBatchInfoForm.setGoodsProductDate(DateUtils.str2Date(goodsBatchInfoForm.getProductDateStr()));
+        ResultVO resultVO = goodsBatchManagerService.addGoodsBatchRecord(goodsBatchInfoForm);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "修改商品批次记录信息",notes = "通过商品批次基本信息,修改商品批次记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "goodsBatchInfoForm",value = "商品批次基本信息",dataType = "GoodsBatchInfoForm")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_BATCH_EDIT)
+    @PostMapping("/edit")
+    public ResponseBase editGoodsBatchInfo(@RequestBody GoodsBatchInfoForm goodsBatchInfoForm){
+        BaseInfoDO baseInfoDO = this.initiSaveObject();
+        if(baseInfoDO==null){
+            return responseError(new ResultVO(ResultEnum.TOKEN_EXPIRED));
+        }
+        BeanCopyUtil.copyBean(baseInfoDO,goodsBatchInfoForm);
+        goodsBatchInfoForm.setGoodsProductDate(DateUtils.str2Date(goodsBatchInfoForm.getProductDateStr()));
+        ResultVO resultVO = goodsBatchManagerService.editGoodsBatchRecord(goodsBatchInfoForm);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "删除商品批次记录信息",notes = "通过商品批次唯一标识,删除商品批次记录信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "商品批次唯一标识",dataType = "String",paramType = "query")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_BATCH_DEL)
+    @GetMapping("/del")
+    public ResponseBase delGoodsBatchInfo(@RequestParam("guid") String guid){
+        if(this.getOrgGuid()==null || "".equals(this.getOrgGuid())) {
+            return responseError(new ResultVO(ResultEnum.TOKEN_EXPIRED));
+        }
+        ResultVO resultVO = goodsBatchManagerService.delGoodsBatchRecordById(guid,this.getOrgGuid());
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "查询商品批次明细信息",notes = "通过商品批次唯一标识,查询商品批次明细信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "商品批次唯一标识",dataType = "String",paramType = "query")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_BATCH_GET)
+    @GetMapping("/searchById")
+    public ResponseBase searchBatchInfoById(@RequestParam("guid") String guid){
+        ResultVO resultVO = goodsBatchManagerService.getGoodsBatchRecordById(guid);
+        return responseSuccess(resultVO);
+    }
+
+
+    @ApiOperation(value = "生成溯源码记录",notes = "通过商品批次唯一标识,查询商品批次明细信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "goodsBatchInfoForm",value = "商品批次信息",dataType = "GoodsBatchInfoForm")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_BATCH_CODE)
+    @PostMapping("/batchGoodsQRCode")
+    public ResponseBase saveQRCodeInfo(@RequestBody GoodsBatchInfoForm goodsBatchInfoForm){
+        BaseInfoDO baseInfoDO = this.initiSaveObject();
+        if(baseInfoDO==null){
+            return responseError(new ResultVO(ResultEnum.TOKEN_EXPIRED));
+        }
+        Integer qcount = goodsBatchInfoForm.getQrcodeCount();
+        if(qcount==null || qcount<=0 || qcount>=ONEC_MAX_QR_COUNT){
+            return responseError(new ResultVO(ResultEnum.PARAMETER_INPUT_ERROR));
+        }
+        BeanCopyUtil.copyBean(baseInfoDO,goodsBatchInfoForm);
+        ResultVO resultVO = goodsBatchManagerService.batchGoodsQRCode(goodsBatchInfoForm);
+        return responseSuccess(resultVO);
+    }
+    
+    @ApiOperation(value = "查询产地物联检测信息",notes = "查询产地物联检测信息")
+    @ApiImplicitParams({
+    	@ApiImplicitParam(name = "fieldGuid",value = "产地id",dataType = "String")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate
+    @GetMapping("/getInterAuxList")
+    public ResponseBase getInterAuxList(@RequestParam("fieldGuid") String fieldGuid,String goodsBatchGuid){
+    	ResultVO resultVO = new ResultVO<>();
+    	
+    	EasyHttpUtils easyHttpUtils = EasyHttpUtils.LoadInstance();
+    	String url = wlwhost + "/devid/orchardSeCon?base_id=" + fieldGuid;
+    	String s = null;
+    	try {
+    		s = easyHttpUtils.get(url);
+		} catch (Exception e) {
+			// TODO: handle exception
+			System.out.println(e.getMessage());
+		}
+    	
+    	if(s == null) {
+    		resultVO.setCode(1);
+        	resultVO.setMsg("物联网系统服务断开");
+        	return responseError(resultVO);
+    	}
+        JSONObject jsonObject = JSON.parseObject(s);
+        String key = "retHead";
+        JSONObject retDataJson = jsonObject.getJSONObject(key);
+        key = "errCod";
+        String string = retDataJson.getString(key);
+        List<Object> list = null;
+        List<GoodsInterAuxiliary> interAuxList = new ArrayList<>();
+        if ("0".equals(string)) {
+            key = "retBody";
+            retDataJson = jsonObject.getJSONObject(key);
+            if (!StringUtils.isEmpty(retDataJson)) {
+                key = "list";
+                list = retDataJson.getJSONArray(key);
+                
+                if(list != null && list.size() > 0) {
+                	for (Object object : list) {
+                		JSONObject date = (JSONObject) object;
+                		GoodsInterAuxiliary form = new GoodsInterAuxiliary();
+                		form.setFkGoodsBatchGuid(goodsBatchGuid);
+						form.setAuxItme(date.getString("orchard_type"));
+						form.setAuxItmeNormval(date.getString("dat_value") != null ? date.getString("dat_value") : "0");
+						//form.setAuxItmeNormval(date.getString("dat_value") != null ? date.getString("dat_value") + date.getString("unit") : "0" + date.getString("unit"));
+						form.setUnit(date.getString("unit"));
+						interAuxList.add(form);
+					}
+                }
+            }
+            
+            resultVO.setData(interAuxList);
+        }else {
+        	resultVO.setCode(1);
+        	resultVO.setMsg("物联网系统服务断开");
+        }
+        
+    	return responseSuccess(resultVO);
+    }
+    
+}

+ 139 - 0
src/main/java/com/hcloud/microservice/traced/web/goodsmanager/GoodsDealerManageController.java

@@ -0,0 +1,139 @@
+package com.hcloud.microservice.traced.web.goodsmanager;
+
+import java.util.Date;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.repository.query.Param;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.hcloud.microserver.commoncore.annotation.AuthOrgValidate;
+import com.hcloud.microserver.commoncore.base.ResponseBase;
+import com.hcloud.microserver.commoncore.base.ResultVO;
+import com.hcloud.microserver.commoncore.enums.OrgAuthEnum;
+import com.hcloud.microserver.commoncore.exception.GlobalException;
+import com.hcloud.microserver.commoncore.util.BeanCopyUtil;
+import com.hcloud.microserver.commoncore.util.string.StringUtil;
+import com.hcloud.microservice.goods.facade.clients.GoodsDealerClient;
+import com.hcloud.microservice.goods.facade.entity.GoodsDealer;
+import com.hcloud.microservice.goods.facade.forms.GoodsDealerForm;
+import com.hcloud.microservice.traced.common.BaseInfoDO;
+import com.hcloud.microservice.traced.common.TracedBaseController;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+
+/**
+ * 经销商管理
+ * @author lym
+ *
+ */
+@RestController
+@RequestMapping("/web/goods/dealer")
+@Api(description = "经销商信息管理")
+public class GoodsDealerManageController extends TracedBaseController{
+	
+	@Autowired
+	private GoodsDealerClient goodsDealerClient;
+	
+	@ApiOperation(value = "获取经销商编码",notes = "获取经销商编码")
+	@ApiResponse(code =0,message = "操作成功")
+	@AuthOrgValidate
+	@GetMapping("/getCode")
+	public ResponseBase getMaxCode() {
+		ResultVO resultVO = goodsDealerClient.getMaxCode();
+		return responseSuccess(resultVO);
+	}
+	
+	@ApiOperation(value = "添加经销商信息",notes = "添加经销商信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "goodsDealer",value = "经销商信息",dataType = "GoodsDealer")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_SYS_DEALER_ADD)
+	@PostMapping("/add")
+	public ResponseBase add(@RequestBody GoodsDealer goodsDealer) {
+		goodsDealer.setFkOrgGuid(this.getOrgGuid());
+		goodsDealer.setCreateUser(this.getUserId());
+		goodsDealer.setCreateTime(new Date());
+		goodsDealer.setState(1);
+		ResultVO resultVO = goodsDealerClient.add(goodsDealer);
+		return responseSuccess(resultVO);
+	}
+	
+	@ApiOperation(value = "查询经销商信息",notes = "查询经销商信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "主键",dataType = "String")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_SYS_DEALER)
+	@GetMapping("/findById")
+	public ResponseBase findById(@Param("guid") String guid) {
+		ResultVO resultVO = goodsDealerClient.findById(guid);
+		return responseSuccess(resultVO);
+	}
+	
+	@ApiOperation(value = "修改经销商信息",notes = "修改经销商信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "goodsDealer",value = "经销商信息",dataType = "GoodsDealer")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_SYS_DEALER_EDIT)
+	@PostMapping("/edit")
+	public ResponseBase edit(@RequestBody GoodsDealer goodsDealer) {
+		goodsDealer.setModifiedUser(this.getUserId());
+		goodsDealer.setModifiedTime(new Date());
+		ResultVO resultVO = goodsDealerClient.edit(goodsDealer);
+		return responseSuccess(resultVO);
+	}
+ 
+	@ApiOperation(value = "查询经销商信息",notes = "分页查询经销商信息,默认分页条数10条")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "goodsDealerForm",value = "查询条件",dataType = "GoodsDealerForm")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_SYS_DEALER)
+	@PostMapping("/searchByPage")
+    public ResponseBase searchByPage(@RequestBody GoodsDealerForm goodsDealerForm){
+		goodsDealerForm.setFkOrgGuid(this.getOrgGuid());
+        ResultVO resultVO = goodsDealerClient.searchByPage(goodsDealerForm);
+        return responseSuccess(resultVO);
+    }
+	
+	@ApiOperation(value = "删除经销商信息",notes = "删除经销商信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "主键",dataType = "String")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_SYS_DEALER)
+	@GetMapping("/delete")
+	public ResponseBase delete(@Param("guid") String guid) {
+		ResultVO resultVO = goodsDealerClient.delete(guid);
+		return responseSuccess(resultVO);
+	}
+	
+	@ApiOperation(value = "查询经销商信息",notes = "查询经销商信息")
+	@ApiImplicitParams({
+		@ApiImplicitParam(name = "goodsDealerForm",value = "查询条件",dataType = "GoodsDealerForm")
+	})
+	@ApiResponse(code =0,message = "操作成功")
+	@AuthOrgValidate
+	@PostMapping("/selectGoodsDealer")
+	public ResponseBase delete(@RequestBody GoodsDealerForm goodsDealerForm) {
+		if(StringUtil.isEmpty(goodsDealerForm.getFkOrgGuid())) {
+			throw new GlobalException(1, "获取附近经销商信息失败");
+		}
+		/*if(StringUtil.isEmpty(goodsDealerForm.getLatitudeLongitude())) {
+			throw new GlobalException(1, "获取定位失败,请检查是否打开定位");
+		}*/
+		
+		ResultVO resultVO = goodsDealerClient.searchByPage(goodsDealerForm);
+		return responseSuccess(resultVO);
+	}
+}

+ 221 - 0
src/main/java/com/hcloud/microservice/traced/web/goodsmanager/GoodsFieldManageController.java

@@ -0,0 +1,221 @@
+package com.hcloud.microservice.traced.web.goodsmanager;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.hcloud.microserver.commoncore.annotation.AuthOrgValidate;
+import com.hcloud.microserver.commoncore.base.ResponseBase;
+import com.hcloud.microserver.commoncore.base.ResultVO;
+import com.hcloud.microserver.commoncore.constant.GlobleConstant;
+import com.hcloud.microserver.commoncore.enums.OrgAuthEnum;
+import com.hcloud.microserver.commoncore.enums.ResultEnum;
+import com.hcloud.microserver.commoncore.util.BeanCopyUtil;
+import com.hcloud.microserver.commoncore.util.EasyHttpUtils;
+import com.hcloud.microservice.goods.facade.clients.GoodsFieldManageService;
+import com.hcloud.microservice.goods.facade.forms.GoodsFieldForm;
+import com.hcloud.microservice.org.facade.client.PositionManagerService;
+import com.hcloud.microservice.traced.common.BaseInfoDO;
+import com.hcloud.microservice.traced.common.TracedBaseController;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+
+/**
+ * @author xiezt
+ */
+@RestController
+@RequestMapping("/web/goods/field")
+@Api(description = "商品产地服务")
+public class GoodsFieldManageController extends TracedBaseController {
+
+    @Autowired
+    private GoodsFieldManageService goodsFieldManageService;
+
+    @Autowired
+    private PositionManagerService positionManagerService;
+    
+    @Value("${wlw.address}")
+    private String wlwhost;
+
+    @ApiOperation(value = "查询商品产地信息",notes = "分页查询商品产地信息,默认分页条数10条")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "fieldForm",value = "查询条件",dataType = "GoodsFieldForm")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_FIELD_QUERY)
+    @PostMapping("/searchByPage")
+    public ResponseBase searchByPage(@RequestBody GoodsFieldForm fieldForm){
+        BaseInfoDO infoDO = initiSaveObject();
+        if(infoDO==null){return responseError(new ResultVO(ResultEnum.TOKEN_EXPIRED));}
+        BeanCopyUtil.copyBean(infoDO,fieldForm);
+        ResultVO resultVO = goodsFieldManageService.queryGoodsFieldByPage(fieldForm);
+        return responseSuccess(resultVO);
+    }
+
+
+    @ApiOperation(value = "添加产地信息",notes = "通过产地属性及附加属性添加产地信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "fieldForm",value = "产地信息内容",dataType = "GoodsFieldForm"),
+            @ApiImplicitParam(name = "auxList",value = "附加信息列表",dataType = "List")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_FIELD_ADD)
+    @PostMapping("/add")
+    public ResponseBase addGoodsFieldInfo(@RequestBody GoodsFieldForm fieldForm){
+        fieldForm.setFkOrgGuid(this.getOrgGuid());
+        fieldForm.setFkProductGuid(GlobleConstant.PRODUCT_GUID);
+        fieldForm.setState(1);
+        fieldForm.setCreateUser(this.getUserId());
+        fieldForm.setModifiedUser(this.getUserId());
+        fieldForm.setCreateTime(new Date());
+        fieldForm.setModifiedTime(new Date());
+        ResultVO resultVO = goodsFieldManageService.addGoodsField(fieldForm);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "修改产地信息",notes = "通过产地属性及附加属性修改产地信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "fieldForm",value = "产地信息内容",dataType = "GoodsFieldForm"),
+            @ApiImplicitParam(name = "auxList",value = "附加信息列表",dataType = "List")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_FIELD_EDIT)
+    @PostMapping("/edit")
+    public ResponseBase editGoodsFieldInfo(@RequestBody GoodsFieldForm fieldForm){
+    	fieldForm.setFkOrgGuid(this.getOrgGuid());
+    	fieldForm.setModifiedUser(this.getUserId());
+        fieldForm.setModifiedTime(new Date());
+        ResultVO resultVO = goodsFieldManageService.editGoodsField(fieldForm);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "查询产地明细信息",notes = "通过产地唯一标识查询产地信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "产地唯一标识",dataType = "String",paramType = "query")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_FIELD_GET)
+    @GetMapping("/searchById")
+    public ResponseBase getGoodsFieldInfo(@RequestParam("guid") String guid){
+        ResultVO resultVO = goodsFieldManageService.getGoodsField(guid,this.getOrgGuid());
+        return responseSuccess(resultVO);
+    }
+
+
+    @ApiOperation(value = "删除产地信息",notes = "通过产品唯一主键逻辑删除产地信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "产地唯一标识",dataType = "String",paramType = "query")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_FIELD_DEL)
+    @GetMapping("/del")
+    public ResponseBase delGoodsFieldInfo(@RequestParam("guid") String guid){
+        ResultVO resultVO = goodsFieldManageService.delGoodsField(guid,this.getOrgGuid());
+        return responseSuccess(resultVO);
+    }
+
+
+    @ApiOperation(value = "商品地址信息",notes = "商品地址信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "parentId",value = "地址编码",dataType = "String",paramType = "query")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate
+    @GetMapping("/getAreaInfo")
+    public ResponseBase getAreaInfoByCode(String parentId){
+        if(parentId==null || "".equals(parentId)){
+            parentId="#";
+        }
+        ResultVO resultVO = positionManagerService.getBasePositionByParentCode(parentId);
+        return responseSuccess(resultVO);
+    }
+    
+    @ApiOperation(value = "查询物联网基地信息",notes = "查询物联网基地信息")
+    @ApiImplicitParams({
+    	@ApiImplicitParam(name = "customerId",value = "企业id",dataType = "String")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate
+    @GetMapping("/getBaseList")
+    public ResponseBase getBaseList(String customerId){
+    	ResultVO resultVO = new ResultVO<>();
+    	List<GoodsFieldForm> GoodsFieldList = new ArrayList<>();
+    	
+    	EasyHttpUtils easyHttpUtils = EasyHttpUtils.LoadInstance();
+    	String url = wlwhost + "/devid/orchardSe?customer_id=" + customerId;
+    	String s = null;
+    	try {
+    		s = easyHttpUtils.get(url);
+		} catch (Exception e) {
+			// TODO: handle exception
+			System.out.println(e.getMessage());
+		}
+    	
+    	if(s == null) {
+    		//resultVO.setCode(1);
+        	//resultVO.setMsg("物联网系统服务断开");
+        	resultVO.setData(GoodsFieldList);
+        	return responseError(resultVO);
+    	}
+        JSONObject jsonObject = JSON.parseObject(s);
+        String key = "retHead";
+        JSONObject retDataJson = jsonObject.getJSONObject(key);
+        key = "errCod";
+        String string = retDataJson.getString(key);
+        List<Object> list = null;
+        
+        
+        if ("0".equals(string)) {
+            key = "retBody";
+            retDataJson = jsonObject.getJSONObject(key);
+            if (!StringUtils.isEmpty(retDataJson)) {
+                key = "list";
+                list = retDataJson.getJSONArray(key);
+                
+                if(list != null && list.size() > 0) {
+                	for (Object object : list) {
+                		JSONObject date = (JSONObject) object;
+						GoodsFieldForm form = new GoodsFieldForm();
+						form.setGuid(date.getString("id"));
+						form.setFieldName(date.getString("baseName"));
+						form.setSaleGoodsRange(date.getString("baseOutput"));
+						form.setFieldArea(date.getString("baseScale"));
+						form.setProvinceId(date.getString("provinceId"));
+						form.setCityId(date.getString("cityId"));
+						form.setCountyId(date.getString("areaId"));
+						if(date.getString("areaId") != null) {
+							form.setFkPostionId(date.getString("areaId"));
+						}else if(date.getString("cityId") != null) {
+							form.setFkPostionId(date.getString("cityId"));
+						}else if(date.getString("provinceId") != null) {
+	                		form.setFkPostionId(date.getString("provinceId"));
+	                	}
+						form.setFieldAddress(date.getString("address"));
+						form.setRemark(date.getString("baseSynopsis"));
+						GoodsFieldList.add(form);
+					}
+                }
+            }
+        }
+        
+    	resultVO.setData(GoodsFieldList);
+    	return responseSuccess(resultVO);
+    }
+
+}

+ 100 - 0
src/main/java/com/hcloud/microservice/traced/web/goodsmanager/GoodsManageController.java

@@ -0,0 +1,100 @@
+package com.hcloud.microservice.traced.web.goodsmanager;
+
+import com.hcloud.microserver.commoncore.annotation.AuthOrgValidate;
+import com.hcloud.microserver.commoncore.annotation.AuthValidate;
+import com.hcloud.microserver.commoncore.base.BaseController;
+import com.hcloud.microserver.commoncore.base.ResponseBase;
+import com.hcloud.microserver.commoncore.base.ResultVO;
+import com.hcloud.microserver.commoncore.constant.GlobleConstant;
+import com.hcloud.microserver.commoncore.enums.OrgAuthEnum;
+import com.hcloud.microserver.commoncore.util.BeanCopyUtil;
+import com.hcloud.microservice.goods.facade.clients.GoodsManagerService;
+import com.hcloud.microservice.goods.facade.forms.GoodsInfoForm;
+import com.hcloud.microservice.traced.common.BaseInfoDO;
+import com.hcloud.microservice.traced.common.TracedBaseController;
+import io.swagger.annotations.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+
+/**
+ * @author xiezt
+ */
+@Slf4j
+@RestController
+@RequestMapping("/web/goods")
+@Api(description = "商品服务")
+public class GoodsManageController extends TracedBaseController {
+
+    @Autowired
+    private GoodsManagerService goodsManagerService;
+
+    @ApiOperation(value = "查询商品信息",notes = "分页查询商品信息,默认分页条数10条")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "goodsInfoForm",value = "查询条件",dataType = "GoodsIForm")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_INFO_QUERY)
+    @PostMapping("/searchByPage")
+    public ResponseBase searchByPage(@RequestBody GoodsInfoForm goodsInfoForm){
+        goodsInfoForm.setFkOrgGuid(this.getOrgGuid());
+        ResultVO resultVO = goodsManagerService.searchGoodsInfoByPage(goodsInfoForm);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "添加商品信息",notes = "通过商品基本信息,添加商品记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "goodsInfoForm",value = "商品基本信息",dataType = "GoodsInfoForm")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_INFO_ADD)
+    @PostMapping("/add")
+    public ResponseBase addGoodsInfo(@RequestBody GoodsInfoForm goodsInfoForm){
+        BaseInfoDO infoDO = this.initiSaveObject();
+        BeanCopyUtil.copyBean(infoDO,goodsInfoForm);
+        log.info("goodsInfoForm==============>{}",goodsInfoForm);
+        ResultVO resultVO = goodsManagerService.addGoodsInfo(goodsInfoForm);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "修改商品信息",notes = "通过商品基本信息,修改商品记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "goodsInfoForm",value = "修改基本信息",dataType = "GoodsInfoForm")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_INFO_EDIT)
+    @PostMapping("/edit")
+    public ResponseBase editGoodsInfo(@RequestBody GoodsInfoForm goodsInfoForm){
+        ResultVO resultVO = goodsManagerService.editGoodsInfo(goodsInfoForm);
+        return responseSuccess(resultVO);
+    }
+
+
+    @ApiOperation(value = "查询商品明细信息",notes = "通过商品唯一标识查询商品记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "商品唯一标识",dataType = "String",paramType = "query")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_INFO_GET)
+    @GetMapping("/searchById")
+    public ResponseBase getGoodsInfo(@RequestParam("guid") String guid){
+        ResultVO resultVO = goodsManagerService.getGoodsInfoById(guid);
+        return responseSuccess(resultVO);
+    }
+
+
+    @ApiOperation(value = "删除商品信息",notes = "通过商品唯一标识删除商品记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "商品唯一标识",dataType = "String",paramType = "query")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_INFO_DEL)
+    @GetMapping("/del")
+    public ResponseBase delGoodsInfo(@RequestParam("guid") String guid){
+        ResultVO resultVO = goodsManagerService.delGoodsInfoById(guid);
+        return responseSuccess(resultVO);
+    }
+
+}

+ 77 - 0
src/main/java/com/hcloud/microservice/traced/web/goodsmanager/GoodsProInputsManagerController.java

@@ -0,0 +1,77 @@
+package com.hcloud.microservice.traced.web.goodsmanager;
+
+import com.hcloud.microserver.commoncore.annotation.AuthOrgValidate;
+import com.hcloud.microserver.commoncore.base.ResponseBase;
+import com.hcloud.microserver.commoncore.base.ResultVO;
+import com.hcloud.microserver.commoncore.enums.ResultEnum;
+import com.hcloud.microserver.commoncore.util.BeanCopyUtil;
+import com.hcloud.microservice.goods.facade.clients.GoodsProInputsManagerService;
+import com.hcloud.microservice.goods.facade.forms.GoodsProInputsForm;
+import com.hcloud.microservice.traced.common.BaseInfoDO;
+import com.hcloud.microservice.traced.common.TracedBaseController;
+import io.swagger.annotations.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author JYJ
+ */
+@RestController
+@RequestMapping("/web/inputs")
+@Api(description = "原料投入品服务")
+public class GoodsProInputsManagerController extends TracedBaseController {
+
+    @Autowired
+    private GoodsProInputsManagerService goodsProInputsManagerService;
+
+    @ApiOperation(value = "分页查询评价信息",notes = "分页查询商品评价信息,默认分页条数10条")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "goodsBatchFeedbackForm",value = "查询条件",dataType = "GoodsBatchFeedbackForm")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate
+    @PostMapping("/searchByPage")
+    public ResponseBase searchProInputsByPage(@RequestBody GoodsProInputsForm goodsProInputsForm){
+       ResultVO resultVO =  goodsProInputsManagerService.searchProInputsByPage(goodsProInputsForm);
+        return responseError(resultVO);
+    }
+
+    @ApiOperation(value = "查询溯源投入品通批次编号",notes = "查询溯源投入品通批次编号")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "foreignKey",value = "查询条件",dataType = "String",paramType = "query")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate
+    @GetMapping("/searchByFK")
+    public ResponseBase searchProInputsByFK(@RequestParam("foreignKey") String foreignKey){
+        ResultVO resultVO =  goodsProInputsManagerService.searchProInputsByFK(foreignKey);
+        return responseError(resultVO);
+    }
+
+    @ApiOperation(value = "删除生产原料信息",notes = "删除生产原料信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "生产原料唯一标识",dataType = "String",paramType = "query")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate
+    @GetMapping("/del")
+    public ResponseBase delProInputs(@RequestParam("guid") String guid){
+        ResultVO resultVO =  goodsProInputsManagerService.delProInputs(guid);
+        return responseError(resultVO);
+    }
+
+    @ApiOperation(value = "保存生产原料信息",notes = "保存生产原料信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "goodsProInputsForm",value = "保存生产原料信息",dataType = "GoodsProInputsForm")
+    })
+    @ApiResponse(code =0,message = "保存成功")
+    @AuthOrgValidate
+    @PostMapping("/save")
+    public ResponseBase saveProInputs(@RequestBody GoodsProInputsForm goodsProInputsForm){
+        BaseInfoDO baseInfoDO = this.initiSaveObject();
+        if (baseInfoDO==null){return responseError(new ResultVO(ResultEnum.TOKEN_EXPIRED));}
+        BeanCopyUtil.copyBean(baseInfoDO,goodsProInputsForm);
+        ResultVO resultVO =  goodsProInputsManagerService.saveProInputs(goodsProInputsForm);
+        return responseSuccess(resultVO);
+    }
+}

+ 81 - 0
src/main/java/com/hcloud/microservice/traced/web/goodsmanager/GoodsProNormalManagerController.java

@@ -0,0 +1,81 @@
+package com.hcloud.microservice.traced.web.goodsmanager;
+
+import com.hcloud.microserver.commoncore.annotation.AuthOrgValidate;
+import com.hcloud.microserver.commoncore.base.ResponseBase;
+import com.hcloud.microserver.commoncore.base.ResultVO;
+import com.hcloud.microserver.commoncore.enums.ResultEnum;
+import com.hcloud.microserver.commoncore.util.BeanCopyUtil;
+import com.hcloud.microservice.goods.facade.clients.GoodsProNormalManagerService;
+import com.hcloud.microservice.goods.facade.forms.GoodsProInputsForm;
+import com.hcloud.microservice.goods.facade.forms.GoodsProNormalForm;
+import com.hcloud.microservice.traced.common.BaseInfoDO;
+import com.hcloud.microservice.traced.common.TracedBaseController;
+import io.swagger.annotations.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author JYJ
+ */
+@RestController
+@RequestMapping("/web/normal")
+@Api(description = "通用生产过程服务")
+public class GoodsProNormalManagerController extends TracedBaseController {
+
+    @Autowired
+    private GoodsProNormalManagerService goodsProNormalManagerService;
+
+    @ApiOperation(value = "分页查询溯源流通信息",notes = "分页查询溯源流通信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "goodsProNormalForm",value = "查询条件",dataType = "GoodsProNormalForm")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate
+    @PostMapping("/searchByPage")
+    public ResponseBase searchProInputsByPage(@RequestBody GoodsProNormalForm goodsProNormalForm){
+        ResultVO resultVO =  goodsProNormalManagerService.searchProNormalByPage(goodsProNormalForm);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "保存溯源流通信息",notes = "保存溯源流通信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "goodsProNormalForm",value = "溯源流通信息",dataType = "GoodsProNormalForm")
+    })
+    @ApiResponse(code =0,message = "保存成功")
+    @AuthOrgValidate
+    @PostMapping("/save")
+    public ResponseBase saveProNormal(@RequestBody GoodsProNormalForm goodsProNormalForm){
+        BaseInfoDO baseInfoDO = this.initiSaveObject();
+        if (baseInfoDO==null){return responseError(new ResultVO(ResultEnum.TOKEN_EXPIRED));}
+        BeanCopyUtil.copyBean(baseInfoDO,goodsProNormalForm);
+        ResultVO resultVO =  goodsProNormalManagerService.saveProNormal(goodsProNormalForm);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "更新溯源流通信息",notes = "更新溯源流通信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "goodsProNormalForm",value = "查询条件",dataType = "GoodsProNormalForm")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate
+    @PostMapping("/edit")
+    public ResponseBase updateProNormalInfo(@RequestBody GoodsProNormalForm goodsProNormalForm){
+        BaseInfoDO baseInfoDO = this.initiSaveObject();
+        if (baseInfoDO==null){return responseError(new ResultVO(ResultEnum.TOKEN_EXPIRED));}
+        BeanCopyUtil.copyBean(baseInfoDO,goodsProNormalForm);
+        ResultVO resultVO =  goodsProNormalManagerService.updateProNormal(goodsProNormalForm);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "删除溯源流通信息",notes = "删除溯源流通信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "查询条件",dataType = "String",paramType = "query")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate
+    @GetMapping("/del")
+    public ResponseBase delProNormalInfo(@RequestParam("guid") String guid){
+        ResultVO resultVO =  goodsProNormalManagerService.delProNormalByPK(guid);
+        return responseSuccess(resultVO);
+    }
+}

+ 97 - 0
src/main/java/com/hcloud/microservice/traced/web/goodsmanager/QRCodeInfoManageController.java

@@ -0,0 +1,97 @@
+package com.hcloud.microservice.traced.web.goodsmanager;
+
+import com.hcloud.microserver.commoncore.annotation.AuthOrgValidate;
+import com.hcloud.microserver.commoncore.base.ResponseBase;
+import com.hcloud.microserver.commoncore.base.ResultVO;
+import com.hcloud.microserver.commoncore.enums.OrgAuthEnum;
+import com.hcloud.microserver.commoncore.enums.ResultEnum;
+import com.hcloud.microserver.commoncore.exception.GlobalException;
+import com.hcloud.microserver.commoncore.util.BeanCopyUtil;
+import com.hcloud.microservice.goods.facade.clients.GoodsQRCodeManagerService;
+import com.hcloud.microservice.goods.facade.forms.GoodsQRCodeInfoForm;
+import com.hcloud.microservice.traced.common.BaseInfoDO;
+import com.hcloud.microservice.traced.common.TracedBaseController;
+import io.swagger.annotations.*;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author xiezt
+ */
+@Slf4j
+@RestController
+@RequestMapping("/web/code/info")
+@Api(description = "web端处理溯源码服务",tags = {"webCodeService"})
+public class QRCodeInfoManageController extends TracedBaseController {
+
+    @Autowired
+    private GoodsQRCodeManagerService goodsQRCodeManagerService;
+
+    @ApiOperation(value = "废弃溯源",notes = "通过溯源码唯一标识属性,废弃溯源码信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "溯源码唯一标识",dataType = "String",paramType = "query")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate
+    @GetMapping("/forbidden")
+    public ResponseBase forbiddenQRCodeInfo(@RequestParam("guid") String guid){
+        GoodsQRCodeInfoForm goodsQRCodeInfoForm = new GoodsQRCodeInfoForm();
+        goodsQRCodeInfoForm.setGuid(guid);
+        BaseInfoDO baseInfoDO = this.initiSaveObject();
+        if(baseInfoDO==null){return responseError(new ResultVO(ResultEnum.TOKEN_EXPIRED));}
+        BeanCopyUtil.copyBean(baseInfoDO,goodsQRCodeInfoForm);
+        ResultVO resultVO = goodsQRCodeManagerService.delGoodsQRCodeById(goodsQRCodeInfoForm);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "预览溯源码信息",notes = "通过溯源码加密字符,查询溯源码信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "qrToken",value = "溯源码加密字符",dataType = "String",paramType = "query")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate
+    @GetMapping("/show")
+    public ResponseBase getQRCodeInfo(@RequestParam("qrToken") String qrToken){
+        ResultVO resultVO = goodsQRCodeManagerService.getGoodsQRCodeDetailInfoByToken(qrToken);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "溯源码打印",notes = "溯源码打印")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "goodsQRCodeInfoForm",value = "查询条件",dataType = "GoodsQRCodeInfoForm")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_CODE_PRINT)
+    @ResponseBody
+    @PostMapping("/getPrintDetail")
+    public ResponseBase printDetail(@RequestBody GoodsQRCodeInfoForm goodsQRCodeInfoForm){
+        ResultVO tempVo = goodsQRCodeManagerService.getPrintDetail(goodsQRCodeInfoForm);
+        return responseSuccess(tempVo);
+    }
+    
+    @ApiOperation(value = "修改溯源码打印状态",notes = "修改溯源码打印状态")
+    @ApiImplicitParams({
+    	@ApiImplicitParam(name = "ids",value = "打印溯源码id",dataType = "String")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_CODE_PRINT)
+    @ResponseBody
+    @PostMapping("/updateQRIsPrint")
+    public ResponseBase updateQRIsPrint(@RequestBody List<String> ids){
+    	if(null == ids || ids.size() < 1) {
+    		throw new GlobalException(1, "没有要修改的溯源码打印状态");
+    	}
+    	ResultVO tempVo = goodsQRCodeManagerService.updateQRIsPrint(ids);
+    	return responseSuccess(tempVo);
+    }
+}

+ 207 - 0
src/main/java/com/hcloud/microservice/traced/web/goodsmanager/QRCodeRecordManageController.java

@@ -0,0 +1,207 @@
+package com.hcloud.microservice.traced.web.goodsmanager;
+
+import com.alibaba.fastjson.JSONObject;
+import com.hcloud.microserver.commoncore.annotation.AuthOrgValidate;
+import com.hcloud.microserver.commoncore.base.ResponseBase;
+import com.hcloud.microserver.commoncore.base.ResultVO;
+import com.hcloud.microserver.commoncore.enums.OrgAuthEnum;
+import com.hcloud.microserver.commoncore.enums.ResultEnum;
+import com.hcloud.microserver.commoncore.util.BeanCopyUtil;
+import com.hcloud.microserver.commoncore.util.DateUtils;
+import com.hcloud.microserver.commoncore.util.ExportExcelUtil;
+import com.hcloud.microserver.commoncore.util.export.DataField;
+import com.hcloud.microservice.goods.facade.clients.GoodsQRCodeRecordManagerService;
+import com.hcloud.microservice.goods.facade.forms.GoodsQRCodeRecordForm;
+import com.hcloud.microservice.goods.facade.forms.GoodsQRCodeRecordStatForm;
+import com.hcloud.microservice.traced.common.BaseInfoDO;
+import com.hcloud.microservice.traced.common.TracedBaseController;
+import io.swagger.annotations.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author xiezt
+ */
+@Controller
+@RequestMapping("/web/code/record")
+@Api(description = "二维码生成记录服务")
+public class QRCodeRecordManageController extends TracedBaseController {
+
+    @Value("${export.file.excel.path}")
+    private String filePath;
+
+    @Autowired
+    private GoodsQRCodeRecordManagerService goodsQRCodeRecordManagerService;
+
+    @ApiOperation(value = "查询溯源码生成记录信息",notes = "分页查询溯源码生成记录信息,默认分页条数10条")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "goodsQRCodeRecordForm",value = "查询条件",dataType = "GoodsQRCodeRecordForm")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_CODE_QUERY)
+    @ResponseBody
+    @PostMapping("/searchByPage")
+    public ResponseBase searchByPage(@RequestBody GoodsQRCodeRecordForm goodsQRCodeRecordForm){
+        goodsQRCodeRecordForm.setFkOrgGuid(this.getOrgGuid());
+        ResultVO resultVO = goodsQRCodeRecordManagerService.searchGoodsQRCodeRecordByPage(goodsQRCodeRecordForm);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "预览溯源码信息",notes = "通过生成记录Id查询溯源码预览信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "查询条件",dataType = "String",paramType = "query")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_CODE_GET)
+    @ResponseBody
+    @GetMapping("/showDetail")
+    public ResponseBase getDetailByParentId(@RequestParam("guid") String recordId){
+        GoodsQRCodeRecordForm recordForm = new GoodsQRCodeRecordForm();
+        recordForm.setGuid(recordId);
+        recordForm.setPageNo(1);
+        recordForm.setPageSize(18);
+        ResultVO tempVo = goodsQRCodeRecordManagerService.getGoodsQRCodeInfoByRecordId(recordForm);
+        List<Map> tmpList = (List<Map>) tempVo.getData();
+        if(null!=tmpList && tmpList.size()>0){
+            Map map = tmpList.get(0);
+            String parentCode = (String) map.get("qrcodeParentCode");
+            String image = (String) map.get("qrcodeImg");
+            map.put("imagesPath","images/"+parentCode+"/"+image);  //为什么在这里这样拼接,因为前端不想拼接,ps和善的微笑
+            ResultVO resultVO = new ResultVO(ResultEnum.SUCCESS,map);
+            return responseSuccess(resultVO);
+        }else {
+            return responseError(new ResultVO(ResultEnum.SYS_ERROR));
+        }
+    }
+
+    @ApiOperation(value = "查询溯源码生成记录明细",notes = "查询溯源码生成记录明细")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "recordForm",value = "查询条件",dataType = "GoodsQRCodeRecordForm")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_CODE_DETAIL)
+    @ResponseBody
+    @PostMapping("/searchDetailById")
+    public ResponseBase searchDetailByParentId(@RequestBody GoodsQRCodeRecordForm recordForm){
+        ResultVO resultVO = goodsQRCodeRecordManagerService.getGoodsQRCodeInfoByRecordId(recordForm);
+        return responseSuccess(resultVO);
+    }
+
+
+    @ApiOperation(value = "导出溯源码生成记录",notes = "导出溯源码生成记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "溯源码生成记录唯一标识",dataType = "String",paramType = "query")
+    })
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_CODE_EXPORT)
+    @GetMapping("/exportDetailRecord")
+    public void searchDetailForExport(@RequestParam("guid") String recordId){
+        GoodsQRCodeRecordForm recordForm = new GoodsQRCodeRecordForm();
+        recordForm.setPageSize(1000000);
+        recordForm.setGuid(recordId);
+        ResultVO resultVO = goodsQRCodeRecordManagerService.searchGoodsQRCodeRecordForExport(recordForm);
+        List<Map<String,String>> resultList = (List<Map<String, String>>) resultVO.getData();
+            DataField[] fields = {new DataField("商品名称", "goodsName", 10),
+                    new DataField("溯源码", "qrcode", 30),
+                    new DataField("溯源加密码", "qrcodeToken", 30),
+                    new DataField("溯源码地址", "qrcodeUrl", 20),
+                    new DataField("扫码次数", "scanCount", 20),
+                    new DataField("首次扫码时间", "scanFirstTimed", 20),
+                    new DataField("最后一次扫码时间", "scanLastTimed", 20)
+            };
+       ExportExcelUtil.exportExcelForBoot(this.getResponseObject(), resultList, fields, "溯源码列表信息-" + DateUtils.getShortYMDHMS(),filePath);
+    }
+
+    @ApiOperation(value = "废除溯源码生成记录",notes = "废除溯源码生成记录(含溯源码明细)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "生成记录唯一主键",dataType = "String",paramType = "query")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_CODE_ABOLISH)
+    @ResponseBody
+    @GetMapping("/forbiddenCodeInfo")
+    public ResponseBase abolishCodeInfo(@RequestParam("guid") String recordId){
+        GoodsQRCodeRecordForm recordForm = new GoodsQRCodeRecordForm();
+        recordForm.setGuid(recordId);
+        BaseInfoDO baseInfoDO = this.initiSaveObject();
+        BeanCopyUtil.copyBean(baseInfoDO,recordForm);
+        ResultVO resultVO = goodsQRCodeRecordManagerService.delGoodsQRCodeRecord(recordForm);
+        return responseSuccess(resultVO);
+    }
+
+
+    @ApiOperation(value = "删除溯源码生成记录",notes = "删除溯源码生成记录(含溯源码明细)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "生成记录唯一主键",dataType = "String",paramType = "query")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_CODE_DEL)
+    @ResponseBody
+    @GetMapping("/delByPhysical")
+    public ResponseBase delCodeRecordByPhysical(@RequestParam("guid") String recordId){
+        ResultVO resultVO = goodsQRCodeRecordManagerService.delQRCodeInfoPhysical(recordId);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "统计一年各月扫码人数", notes = "统计结果为12个月每个月的扫码人数")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "year", value = "年", dataType = "Integer", paramType = "query")
+    })
+    @AuthOrgValidate//(value = OrgAuthEnum.PLATFORM_GOODS_CODE_STAT_ONE_YEAR_SCAN_NUMS)
+    @ResponseBody
+    @PostMapping("/statOneYear")
+    public ResponseBase statOneYearScanNumber(@RequestBody GoodsQRCodeRecordStatForm goodsQRCodeRecordStatForm) {
+        // 统计当前用户所属机构的数据,所以加入机构guid
+        goodsQRCodeRecordStatForm.setFkOrgGuid(this.getOrgGuid());
+        if(goodsQRCodeRecordStatForm.getYear() == null) {
+        	goodsQRCodeRecordStatForm.setYear(DateUtils.getYear(new Date()));
+        }
+        ResultVO resultVO = this.goodsQRCodeRecordManagerService.statOneYearScanNumber(goodsQRCodeRecordStatForm);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "统计当天和历史累计扫码人数", notes = "暂时先这么弄")
+    @AuthOrgValidate//(value = OrgAuthEnum.PLATFORM_GOODS_CODE_STAT_YESTERDAY_AND_ALL_TIME_SCAN_NUMS)
+    @ResponseBody
+    @PostMapping("/statYesterdayAndAllTime")
+    public ResponseBase statYesterdayAndAllTimeScanNumber(@RequestBody GoodsQRCodeRecordStatForm goodsQRCodeRecordStatForm) {
+        goodsQRCodeRecordStatForm.setFkOrgGuid(this.getOrgGuid());
+        ResultVO resultVO = this.goodsQRCodeRecordManagerService.statYesterdayAndAllTimeScanNumber(goodsQRCodeRecordStatForm);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "统计当天各小时扫码人数", notes = "暂时先这么弄")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_CODE_STAT_ONE_DAY_SCAN_NUMS)
+    @ResponseBody
+    @PostMapping("/statOneDayAllHours")
+    public ResponseBase statOneDayAllHoursScanNumber(@RequestBody GoodsQRCodeRecordStatForm goodsQRCodeRecordStatForm) {
+        goodsQRCodeRecordStatForm.setFkOrgGuid(this.getOrgGuid());
+        ResultVO resultVO = this.goodsQRCodeRecordManagerService.statOneDayAllHoursScanNumber(goodsQRCodeRecordStatForm);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "统计一周7天每天的扫码人数")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_CODE_STAT_ONE_WEEK_SCAN_NUMS)
+    @ResponseBody
+    @PostMapping("/statOneWeekSevenDay")
+    public ResponseBase statOneWeekSevenDayScanNumber(@RequestBody GoodsQRCodeRecordStatForm goodsQRCodeRecordStatForm) {
+        goodsQRCodeRecordStatForm.setFkOrgGuid(this.getOrgGuid());
+        ResultVO resultVO = this.goodsQRCodeRecordManagerService.statOneWeekSevenDayScanNumber(goodsQRCodeRecordStatForm);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "统计本月每天的扫码人数")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_GOODS_CODE_STAT_ONE_MONTH_SCAN_NUMS)
+    @ResponseBody
+    @PostMapping("/statOneMonthAllDays")
+    public ResponseBase statOneMonthAllDaysScanNumber(@RequestBody GoodsQRCodeRecordStatForm goodsQRCodeRecordStatForm) {
+        goodsQRCodeRecordStatForm.setFkOrgGuid(this.getOrgGuid());
+        ResultVO resultVO = this.goodsQRCodeRecordManagerService.statOneMonthAllDaysScanNumber(goodsQRCodeRecordStatForm);
+        return responseSuccess(resultVO);
+    }
+}

+ 111 - 0
src/main/java/com/hcloud/microservice/traced/web/sysmanager/AuthManagerController.java

@@ -0,0 +1,111 @@
+package com.hcloud.microservice.traced.web.sysmanager;
+
+
+import com.google.common.collect.Lists;
+import com.hcloud.microserver.commoncore.annotation.AuthOrgValidate;
+import com.hcloud.microserver.commoncore.annotation.AuthValidate;
+import com.hcloud.microserver.commoncore.base.BaseController;
+import com.hcloud.microserver.commoncore.base.ResponseBase;
+import com.hcloud.microserver.commoncore.base.ResultVO;
+import com.hcloud.microserver.commoncore.enums.AuthEnum;
+import com.hcloud.microserver.commoncore.enums.OrgAuthEnum;
+import com.hcloud.microserver.commoncore.util.BeanCopyUtil;
+import com.hcloud.microservice.org.facade.client.AuthManagerService;
+import com.hcloud.microservice.org.facade.forms.BaseAuthForm;
+import com.hcloud.microservice.org.facade.forms.BaseRoleAuthForm;
+import com.hcloud.microservice.org.facade.forms.BaseUserAuthForm;
+import com.hcloud.microservice.traced.common.TracedBaseController;
+import io.swagger.annotations.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+@Slf4j
+@RestController
+@RequestMapping("/web/auth")
+@Api(description = "平台菜单服务")
+public class AuthManagerController extends TracedBaseController {
+
+    @Autowired
+    private AuthManagerService authManagerService;
+
+
+    @ApiOperation(value = "查询平台权限",notes = "根据平台权限信息查询平台权限记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "baseAuthForm",value = "查询条件",dataType = "BaseAuthForm")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_AUTH_QUERY)
+    @PostMapping("/searchByPage")
+    public ResponseBase searchAuthByPage(@RequestBody BaseAuthForm baseAuthForm){
+        ResultVO resultVO = authManagerService.searchAuthInfoByPage(baseAuthForm);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "添加平台权限信息",notes = "根据平台权限信息添加平台记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "baseAuthForm",value = "权限信息",dataType = "BaseAuthForm")
+    })
+    @ApiResponse(code =0,message = "添加成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_AUTH_ADD)
+    @PostMapping("/add")
+    public ResponseBase addAuthInfo(@RequestBody BaseAuthForm baseAuthForm){
+        ResultVO resultVO = authManagerService.addAuthInfo(baseAuthForm);
+        if(resultVO.getCode()==0){
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+
+    @ApiOperation(value = "修改平台权限信息",notes = "根据平台权限信息修改平台记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "baseAuthForm",value = "权限信息",dataType = "BaseAuthForm")
+    })
+    @ApiResponse(code =0,message = "修改成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_AUTH_EDIT)
+    @PostMapping("/edit")
+    public ResponseBase editAuthInfo(@RequestBody BaseAuthForm baseAuthForm){
+        ResultVO resultVO = authManagerService.updateAuthInfo(baseAuthForm);
+        if(resultVO.getCode()==0){
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+
+    @ApiOperation(value = "删除平台权限信息",notes = "根据平台权限信息删除平台记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "权限主键",paramType = "query",dataType = "String")
+    })
+    @ApiResponse(code =0,message = "删除成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_AUTH_DELETE)
+    @GetMapping("/del")
+    public ResponseBase delAuthInfo(@RequestParam("authId") String guid){
+        BaseAuthForm baseAuthForm = new BaseAuthForm();
+        baseAuthForm.setState(0);
+        baseAuthForm.setGuid(guid);
+        ResultVO resultVO = authManagerService.updateAuthInfo(baseAuthForm);
+        if(resultVO.getCode()==0){
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+
+    @ApiOperation(value = "禁用平台权限信息",notes = "根据平台权限信息禁用平台记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "权限主键",paramType = "query",dataType = "String")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_AUTH_FORBIDDEN)
+    @GetMapping("/forbidden")
+    public ResponseBase forbiddenAuthInfo(@RequestParam("authId") String guid){
+        BaseAuthForm baseAuthForm = new BaseAuthForm();
+        baseAuthForm.setIsForbid(1);
+        baseAuthForm.setGuid(guid);
+        ResultVO resultVO = authManagerService.updateAuthInfo(baseAuthForm);
+        if(resultVO.getCode()==0){
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+}

+ 224 - 0
src/main/java/com/hcloud/microservice/traced/web/sysmanager/OrgManagerController.java

@@ -0,0 +1,224 @@
+package com.hcloud.microservice.traced.web.sysmanager;
+
+import com.hcloud.microserver.commoncore.annotation.AuthOrgValidate;
+import com.hcloud.microserver.commoncore.base.ResponseBase;
+import com.hcloud.microserver.commoncore.base.ResultVO;
+import com.hcloud.microserver.commoncore.constant.GlobleConstant;
+import com.hcloud.microserver.commoncore.enums.OrgAuthEnum;
+import com.hcloud.microserver.commoncore.enums.ResultEnum;
+import com.hcloud.microserver.commoncore.service.RedisUtils;
+import com.hcloud.microserver.commoncore.util.BeanCopyUtil;
+import com.hcloud.microservice.org.facade.client.OrgManagerService;
+import com.hcloud.microservice.org.facade.client.UserManagerService;
+import com.hcloud.microservice.org.facade.entity.BaseOrg;
+import com.hcloud.microservice.org.facade.forms.BaseOrgForm;
+import com.hcloud.microservice.org.facade.forms.BaseUserForm;
+import com.hcloud.microservice.traced.common.BaseInfoDO;
+import com.hcloud.microservice.traced.common.TracedBaseController;
+import io.swagger.annotations.*;
+
+import java.util.Map;
+
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author xiezt
+ */
+@RestController
+@RequestMapping("/web/org")
+@Api(description = "企业管理服务")
+public class OrgManagerController extends TracedBaseController {
+
+    @Autowired
+    private OrgManagerService orgManagerService;
+
+    @Autowired
+    private UserManagerService userManagerService;
+    
+    @Autowired
+    private RedisUtils redisUtils;
+
+    @ApiOperation(value = "查询机构信息",notes = "根据机构信息查询机构权限记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "baseAuthForm",value = "查询条件",dataType = "BaseAuthForm")
+    })
+    @ApiResponse(code =0,message = "查询成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_ORG_QUERY)
+    @PostMapping("/searchByPage")
+    public ResponseBase getAuth(@RequestBody BaseOrgForm baseOrgForm){
+        ResultVO resultVO = orgManagerService.searchOrgInfoByPage(baseOrgForm);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "添加机构信息",notes = "根据机构信息添加机构")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "baseOrgForm",value = "机构信息",dataType = "BaseOrgForm")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_ORG_ADD)
+    @PostMapping("/add")
+    public ResponseBase addOrgInfo(@RequestBody BaseOrgForm baseOrgForm){
+        BaseInfoDO infoDO = initiSaveObject();
+        if(infoDO==null){return responseError(new ResultVO(ResultEnum.TOKEN_EXPIRED));}
+        baseOrgForm.setState(infoDO.getState());
+        baseOrgForm.setCreateUser(infoDO.getCreateUser());
+        baseOrgForm.setCreateTime(infoDO.getCreateTime());
+        baseOrgForm.setModifiedUser(infoDO.getModifiedUser());
+        baseOrgForm.setModifiedTime(infoDO.getModifiedTime());
+        ResultVO resultVO = orgManagerService.addOrgInfo(baseOrgForm);
+        if(null!=resultVO && resultVO.getCode()==0){
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+
+    @ApiOperation(value = "修改机构信息",notes = "根据机构信息修改机构基本信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "baseOrgForm",value = "机构信息",dataType = "BaseOrgForm")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_ORG_EDIT)
+    @PostMapping("/edit")
+    public ResponseBase editOrgInfo(@RequestBody BaseOrgForm baseOrgForm){
+        ResultVO resultVO = orgManagerService.updateOrgInfo(baseOrgForm);
+        if(null!=resultVO && resultVO.getCode()==0){
+        	BaseInfoDO baseInfoDO = this.initiSaveObject();
+        	if(baseInfoDO.getFkOrgGuid().equals(baseOrgForm.getGuid())) {
+        		String accessToke = this.getRequestObject().getHeader(ACCESS_TOKEN);
+        		Map redisMap = (Map) redisUtils.getValue(accessToke);
+        		BaseOrg baseOrg = (BaseOrg) redisMap.get(GlobleConstant.ORG_OBJECT);
+        		baseOrg.setQrcodeUrlPrefixe(baseOrgForm.getQrcodeUrlPrefixe());
+        		redisMap.put(GlobleConstant.ORG_OBJECT, baseOrg);
+        		this.redisUtils.setValue(accessToke, redisMap);
+        	}
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+    
+    @ApiOperation(value = "查看机构明细",notes = "根据机构Id查询机构基本信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "机构id",paramType = "query",dataType = "String")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_ORG_GET)
+    @GetMapping("/searchById")
+    public ResponseBase searchInfoById(@RequestParam("guid") String guid){
+        ResultVO resultVO = orgManagerService.searchOrgInfoById(guid);
+        if(null!=resultVO && resultVO.getCode()==0){
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+
+
+    @ApiOperation(value = "删除机构信息",notes = "根据机构信息删除机构基本信息(逻辑删除)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "orgGuid",value = "机构信息",paramType = "query",dataType = "String")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_ORG_DEL)
+    @GetMapping("/del")
+    public ResponseBase delOrgInfo(@RequestParam("guid") String orgGuid){
+        BaseOrgForm baseOrgForm = new BaseOrgForm();
+        baseOrgForm.setState(0);
+        baseOrgForm.setGuid(orgGuid);
+        ResultVO resultVO = orgManagerService.updateOrgInfo(baseOrgForm);
+        if(null!=resultVO && resultVO.getCode()==0){
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+
+    @ApiOperation(value = "查询机构权限信息",notes = "树型结构列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "baseOrgForm",value = "机构信息",paramType = "query",dataType = "BaseOrgForm")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_ORG_SEARCH_AUTH)
+    @GetMapping("/searchAuthInfo")
+    public ResponseBase searchAuthInfo(@RequestParam("orgGuid") String orgGuid){
+        ResultVO resultVO = orgManagerService.searchOrgAuthDistributioned(orgGuid);
+        if(null!= resultVO && resultVO.getCode()==0){
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+
+    @ApiOperation(value = "分配机构权限信息",notes = "组成json数组")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "baseOrgForm",value = "权限列表",dataType = " List<BaseOrgAuthForm>")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_ORG_DIS_AUTH)
+    @PostMapping("/distrOrgAuthInfo")
+    public ResponseBase distrOrgAuthInfo(@RequestBody BaseOrgForm baseOrgForm ) {
+        ResultVO resultVO = orgManagerService.distributionOrgAuthInfo(baseOrgForm.getGuid(),baseOrgForm.getMenuList());
+        if(resultVO.getCode()==0){
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+
+    @ApiOperation(value = "添加企业管理用户",notes = "用户信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "baseUserForm",value = "用户基本信息",dataType = "BaseUserForm")
+    })
+    @ApiResponses({
+            @ApiResponse(code =0,message = "操作成功"),
+            @ApiResponse(code =609,message = "账号重复")
+     })
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_USER_ADD)
+    @PostMapping("/addOrgUser")
+    public ResponseBase addOrgManagerUser(@RequestBody BaseUserForm baseUserForm){
+        BaseInfoDO infoDO = this.initiSaveObject();
+        if(infoDO==null){return responseError(new ResultVO(ResultEnum.TOKEN_EXPIRED));}
+        baseUserForm.setFkProductGuid(GlobleConstant.PRODUCT_GUID);
+        baseUserForm.setLoginOrgGuid(this.getOrgGuid());
+        baseUserForm.setCreateUser(infoDO.getCreateUser());
+        baseUserForm.setModifiedUser(infoDO.getModifiedUser());
+        baseUserForm.setCreateTime(baseUserForm.getCreateTime());
+        baseUserForm.setModifiedTime(baseUserForm.getModifiedTime());
+        baseUserForm.setState(1);
+        ResultVO resultVO = userManagerService.addUserInfo(baseUserForm);
+        if(null!= resultVO && resultVO.getCode()==0){
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+
+
+    @ApiOperation(value = "查看机构推广信息",notes = "查询登录用户所属机构的基本信息")
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_ORG_EXTENDS)
+    @GetMapping("/searchOrgInfo")
+    public ResponseBase searchOrgInfo(){
+        String guid = this.getOrgGuid();
+        if(guid==null){return responseError(new ResultVO(ResultEnum.TOKEN_EXPIRED));}
+        ResultVO resultVO = orgManagerService.searchOrgInfoById(guid);
+        if(null!=resultVO && resultVO.getCode()==0){
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+    @ApiOperation(value = "修改企业推广信息",notes = "修改企业推广信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "baseOrgForm",value = "机构信息",dataType = "BaseOrgForm")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_ORG_EXTENDS)
+    @PostMapping("/editExtendInfo")
+    public ResponseBase editOrgExtendsInfo(@RequestBody BaseOrgForm baseOrgForm){
+        BaseInfoDO baseInfoDO = this.initiSaveObject();
+        if(baseInfoDO==null){return responseError(new ResultVO(ResultEnum.TOKEN_EXPIRED));}
+        BeanCopyUtil.copyBean(baseOrgForm,baseInfoDO);
+        ResultVO resultVO = orgManagerService.updateOrgInfo(baseOrgForm);
+        if(null!=resultVO && resultVO.getCode()==0){
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+
+}

+ 146 - 0
src/main/java/com/hcloud/microservice/traced/web/sysmanager/RoleManagerController.java

@@ -0,0 +1,146 @@
+package com.hcloud.microservice.traced.web.sysmanager;
+
+import com.hcloud.microserver.commoncore.annotation.AuthOrgValidate;
+import com.hcloud.microserver.commoncore.annotation.AuthValidate;
+import com.hcloud.microserver.commoncore.base.BaseController;
+import com.hcloud.microserver.commoncore.base.ResponseBase;
+import com.hcloud.microserver.commoncore.base.ResultVO;
+import com.hcloud.microserver.commoncore.constant.GlobleConstant;
+import com.hcloud.microserver.commoncore.enums.OrgAuthEnum;
+import com.hcloud.microservice.org.facade.client.RoleManagerService;
+import com.hcloud.microservice.org.facade.forms.BaseRoleForm;
+import com.hcloud.microservice.traced.common.TracedBaseController;
+import io.swagger.annotations.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+
+/**
+ * @author xiezt
+ */
+@Slf4j
+@RestController
+@RequestMapping("/web/role")
+@Api(description = "角色管理服务")
+public class RoleManagerController extends TracedBaseController {
+
+    @Autowired
+    private RoleManagerService roleManagerService;
+
+    @ApiOperation(value = "分页查询角色信息",notes = "返回值里的count是记录的总数,")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "baseRoleForm",value = "角色查询信息",dataType = "BaseRoleForm")
+    })
+    @ApiResponse(code =600,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_ROLE_QUERY)
+    @PostMapping("/searchByPage")
+    public ResponseBase searchRoleInfoByPage(@RequestBody BaseRoleForm baseRoleForm){
+        baseRoleForm.setFkOrgGuid(this.getOrgGuid());
+        ResultVO resultVO = roleManagerService.searchRoleInfoByPage(baseRoleForm);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "添加角色信息",notes = "根据角色信息添加角色记录,")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "baseRoleForm",value = "角色信息对象",dataType = "BaseRoleForm")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_ROLE_ADD)
+    @PostMapping("/add")
+    public ResponseBase addRoleInfo(@RequestBody BaseRoleForm baseRoleForm){
+        baseRoleForm.setFkOrgGuid(this.getOrgGuid());
+        baseRoleForm.setFkProductGuid(GlobleConstant.PRODUCT_GUID);
+        baseRoleForm.setState(1);
+        baseRoleForm.setCreateUser(this.getUserId());
+        baseRoleForm.setModifiedUser(this.getUserId());
+        baseRoleForm.setCreateTime(new Date());
+        baseRoleForm.setModifiedTime(new Date());
+        ResultVO resultVO = roleManagerService.addRoleInfo(baseRoleForm);
+        if (null!= resultVO && resultVO.getCode() == 0) {
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+
+    @ApiOperation(value = "修改角色信息",notes = "根据角色信息修改角色记录,")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "baseRoleForm",value = "角色信息对象",dataType = "BaseRoleForm")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_ROLE_EDIT)
+    @PostMapping("/edit")
+    public ResponseBase editRoleInfo(@RequestBody BaseRoleForm baseRoleForm){
+        ResultVO resultVO = roleManagerService.updateRoleInfo(baseRoleForm);
+        if (null!= resultVO && resultVO.getCode() == 0) {
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+
+
+    @ApiOperation(value = "查询角色明细信息",notes = "根据角色id修改角色记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "角色Id",paramType = "query",dataType = "String")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_ROLE_GET)
+    @GetMapping("/searchById")
+    public ResponseBase searchInfoById(@RequestParam("guid") String guid){
+        ResultVO resultVO = roleManagerService.searchInfoById(guid);
+        if (null!= resultVO && resultVO.getCode() == 0) {
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+
+    @ApiOperation(value = "删除角色信息",notes = "根据角色信息修改角色记录,")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "baseRoleForm",value = "角色信息对象",paramType = "query",dataType = "BaseRoleForm")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_ROLE_DEL)
+    @GetMapping("/del")
+    public ResponseBase delRoleInfo(@RequestParam("guid") String roleId){
+        BaseRoleForm baseRoleForm  = new BaseRoleForm();
+        baseRoleForm.setGuid(roleId);
+        baseRoleForm.setState(0);
+        ResultVO resultVO = roleManagerService.updateRoleInfo(baseRoleForm);
+        if (null!= resultVO && resultVO.getCode() == 0) {
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+
+    @ApiOperation(value = "查询角色权限信息",notes = "只能查询本机构下的权限信息,")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roleId",value = "角色ID",paramType = "query",dataType = "String")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_ROLE_SEARCH_AUTH)
+    @GetMapping("/searchRoleAuthInfo")
+    public ResponseBase searchRoleAuthInfo(@RequestParam("roleId") String roleId){
+        log.info("orgGuid===============>{}",this.getOrgGuid());
+        ResultVO resultVO = roleManagerService.searchRoleAuthInfo(roleId,this.getOrgGuid());
+        if (null!= resultVO && resultVO.getCode() == 0) {
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+
+    @ApiOperation(value = "分配角色权限信息",notes = "只能分配本机构下的权限信息,")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "baseRoleForm",value = "角色信息对象",dataType = "BaseRoleForm")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_ROLE_DIS_AUTH)
+    @PostMapping("/distrRoleAuthInfo")
+    public ResponseBase distrRoleAuthInfo(@RequestBody BaseRoleForm baseRoleForm){
+        ResultVO resultVO = roleManagerService.distributionRoleAuth(baseRoleForm.getGuid(),this.getOrgGuid(),baseRoleForm.getMenuList());
+        if (null!= resultVO && resultVO.getCode() == 0) {
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+}

+ 228 - 0
src/main/java/com/hcloud/microservice/traced/web/sysmanager/UserManagerController.java

@@ -0,0 +1,228 @@
+package com.hcloud.microservice.traced.web.sysmanager;
+
+import com.hcloud.microserver.commoncore.annotation.AuthOrgValidate;
+import com.hcloud.microserver.commoncore.annotation.AuthValidate;
+import com.hcloud.microserver.commoncore.base.BaseController;
+import com.hcloud.microserver.commoncore.base.ResponseBase;
+import com.hcloud.microserver.commoncore.base.ResultVO;
+import com.hcloud.microserver.commoncore.constant.GlobleConstant;
+import com.hcloud.microserver.commoncore.enums.AuthEnum;
+import com.hcloud.microserver.commoncore.enums.OrgAuthEnum;
+import com.hcloud.microserver.commoncore.enums.ResultEnum;
+import com.hcloud.microserver.commoncore.util.BeanCopyUtil;
+import com.hcloud.microserver.commoncore.util.Md5Util;
+import com.hcloud.microservice.org.facade.client.UserManagerService;
+import com.hcloud.microservice.org.facade.forms.BaseUserForm;
+import com.hcloud.microservice.traced.common.BaseInfoDO;
+import com.hcloud.microservice.traced.common.TracedBaseController;
+import io.swagger.annotations.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author xiezt
+ */
+@Slf4j
+@RestController
+@RequestMapping("/web/user")
+@Api(description = "用户管理服务")
+public class UserManagerController extends TracedBaseController {
+
+    private static final String INIT_PWD="123123";
+
+    @Autowired
+    private UserManagerService userManagerService;
+
+    @Autowired
+    private RedisTemplate redisTemplate;
+
+
+    @ApiOperation(value = "用户登录",notes = "根据用户名及密码完成登录动作,")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "baseUserForm",value = "用户登录信息(账号,密码)",dataType = "BaseUserForm")
+    })
+    @ApiResponse(code =600,message = "账号或密码不正确")
+    @AuthOrgValidate
+    @PostMapping("/login")
+    public ResponseBase login(@RequestBody BaseUserForm baseUserForm){
+        log.info("account====================>{}",baseUserForm.getAccount());
+        log.info("password====================>{}",baseUserForm.getPasswd());
+        ResultVO resultVO = userManagerService.loginSystem(baseUserForm.getAccount(),baseUserForm.getPasswd());
+        if(resultVO.getCode()==0){
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+
+
+    @ApiOperation(value = "用户登出",notes = "根据用户名访问token注销登录用户,")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "accessToken",value = "权限token",dataType = "String")
+    })
+    @ApiResponse(code =600,message = "账号或密码不正确")
+    @AuthOrgValidate
+    @GetMapping("/logout")
+    public ResponseBase logout(){
+        redisTemplate.delete(this.getRequestObject().getHeader(ACCESS_TOKEN));
+        ResultVO resultVO = new ResultVO(ResultEnum.SUCCESS);
+        return responseSuccess(resultVO);
+    }
+
+    @ApiOperation(value = "添加用户信息",notes = "根据用户信息添加用户记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "baseUserForm",value = "用户信息",dataType = "BaseUserForm")
+    })
+    @ApiResponse(code =609,message = "账号重复")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_USER_ADD)
+    @PostMapping("/add")
+    public ResponseBase addUserInfo(@RequestBody BaseUserForm baseUserForm){
+        BaseInfoDO infoDO = this.initiSaveObject();
+        if(infoDO==null){return responseError(new ResultVO(ResultEnum.TOKEN_EXPIRED));}
+        String remark = baseUserForm.getRemark();
+        BeanCopyUtil.copyBean(infoDO,baseUserForm);
+        baseUserForm.setRemark(remark);
+        ResultVO resultVO = userManagerService.addUserInfo(baseUserForm);
+        if(null!= resultVO && resultVO.getCode()==0){
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+
+    @ApiOperation(value = "修改用户信息",notes = "根据用户信息修改用户记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "baseUserForm",value = "用户信息",dataType = "BaseUserForm")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_USER_EDIT)
+    @PostMapping("/edit")
+    public ResponseBase editUserInfo(@RequestBody BaseUserForm baseUserForm){
+        ResultVO resultVO = userManagerService.updateUserInfo(baseUserForm);
+        if(null!= resultVO && resultVO.getCode()==0){
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+
+    @ApiOperation(value = "禁用用户信息",notes = "根据用户信息修改用户记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "用户id",paramType = "query",dataType = "String")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_USER_FORBIDDEN)
+    @GetMapping("/forbidden")
+    public ResponseBase forbiddenUserInfo(@RequestParam("guid") String guid,@RequestParam("isForbid") Integer isForbid){
+        log.info("==================>{}",this.getOrgGuid());
+        BaseUserForm baseUserForm = new BaseUserForm();
+        baseUserForm.setGuid(guid);
+        baseUserForm.setFkOrgGuid(this.getOrgGuid());
+        if(isForbid==0){
+            baseUserForm.setIsForbid(1);
+        }else{
+            baseUserForm.setIsForbid(0);
+        }
+        ResultVO resultVO = userManagerService.updateUserInfo(baseUserForm);
+        if(null!= resultVO && resultVO.getCode()==0){
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+
+    @ApiOperation(value = "删除用户信息",notes = "根据用户唯一标记用户记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "用户id",paramType = "query",dataType = "String")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_USER_DEL)
+    @GetMapping("/del")
+    public ResponseBase delUserInfo(@RequestParam("guid") String guid){
+        log.info("==================>{}",this.getOrgGuid());
+        BaseUserForm baseUserForm = new BaseUserForm();
+        baseUserForm.setGuid(guid);
+        baseUserForm.setFkOrgGuid(this.getOrgGuid());
+        baseUserForm.setState(0);
+        ResultVO resultVO = userManagerService.updateUserInfo(baseUserForm);
+        if(null!= resultVO && resultVO.getCode()==0){
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+
+    @ApiOperation(value = "重置用户密码",notes = "初始化用户密码")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "用户id",paramType = "query",dataType = "String")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_USER_EDIT)
+    @GetMapping("/restPwd")
+    public ResponseBase restUserPwd(@RequestParam("guid") String guid){
+        log.info("==================>{}",this.getOrgGuid());
+        BaseUserForm baseUserForm = new BaseUserForm();
+        baseUserForm.setGuid(guid);
+        baseUserForm.setFkOrgGuid(this.getOrgGuid());
+        baseUserForm.setPasswd(INIT_PWD);
+        ResultVO resultVO = userManagerService.updateUserInfo(baseUserForm);
+        if(null!= resultVO && resultVO.getCode()==0){
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+
+    @ApiOperation(value = "查询用户权限信息",notes = "与机构权限整合的权限信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "用户Id",paramType = "query",dataType = "String")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_USER_SEARCH_AUTH)
+    @GetMapping("/searchUserAuthInfo")
+    public ResponseBase searchUserAuthInfo(@RequestParam("guid") String guid){
+        ResultVO resultVO = userManagerService.searchUserAuthInfo(guid,this.getOrgGuid());
+        if(null!= resultVO && resultVO.getCode()==0){
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+
+    @ApiOperation(value = "查询用户信息",notes = "分页查询用户信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "baseUserForm",value = "用户对象",dataType = "BaseUserForm")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_USER_QUERY)
+    @PostMapping("/searchByPage")
+    public ResponseBase searchUserInfo(@RequestBody BaseUserForm baseUserForm){
+        if(this.getOrgGuid()==null){
+            return responseError(new ResultVO(ResultEnum.TOKEN_EXPIRED));
+        }
+        baseUserForm.setFkOrgGuid(this.getOrgGuid());
+        ResultVO resultVO = userManagerService.searchUserInfoByPage(baseUserForm);
+        if(null!= resultVO && resultVO.getCode()==0){
+            return responseSuccess(resultVO);
+        }
+        return responseError(resultVO);
+    }
+
+    @ApiOperation(value = "查询用户明细信息",notes = "用户明细")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "guid",value = "用户ID",paramType = "query",dataType = "String")
+    })
+    @ApiResponse(code =0,message = "操作成功")
+    @AuthOrgValidate(value = OrgAuthEnum.PLATFORM_USER_GET)
+    @GetMapping("/searchById")
+    public ResponseBase searchUserInfoById(@RequestParam("guid") String guid){
+        BaseUserForm baseUserForm = new BaseUserForm();
+        baseUserForm.setGuid(guid);
+        baseUserForm.setFkOrgGuid(this.getOrgGuid());
+        ResultVO resultVO = userManagerService.searchUserInfoByPage(baseUserForm);
+        if(null!= resultVO && resultVO.getCode()==0){
+            List list = (List) resultVO.getData();
+            if(null!=list && list.size()>0){
+                return responseSuccess(success(list.get(0)));
+            }
+        }
+        return responseError(resultVO);
+    }
+}

+ 69 - 0
src/main/resources/application-dev.properties

@@ -0,0 +1,69 @@
+server.port=21008
+spring.application.name=traced-web
+spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
+spring.jackson.time-zone=GMT+8
+
+## upload files setting
+spring.http.multipart.maxFileSize=10Mb
+spring.http.multipart.maxRequestSize=10Mb
+img.location=G:/mt/upload/
+spring.mvc.static-path-pattern=/**
+spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,file:${img.location}
+
+
+#zuul timeout setting
+zuul.host.connect-timeout-millis=10000
+zuul.host.socket-timeout-millis=10000
+
+#hystix timeout setting
+feign.hystrix.enabled=true
+#feign调用默认是1000毫秒=1秒   应该设置成更长时间1000 * 60 * 5  = 5分钟  add by six-vision
+hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=300000
+hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=300000
+hystrix.command.default.circuitBreaker.forceClosed=true
+#hystrix.command.default.execution.timeout.enabled=false
+#请求处理的超时时间  add by six-vision
+ribbon.ReadTimeout=300000
+ribbon.SocketTimeout=300000
+#请求连接的超时时间 add by six-vision
+ribbon.ConnectTimeout=30000
+
+# eureka setting
+eureka.instance.hostname=localhost
+eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/
+
+###redis配置#########
+spring.redis.database=0
+spring.redis.host=127.0.0.1
+spring.redis.port=6379
+spring.redis.pool.max-idle=8
+spring.redis.pool.min-idle=0
+spring.redis.pool.max-active=10
+spring.redis.pool.max-wait=-1
+spring.redis.timeout=5000
+
+#wechat setting
+#(一个公众号的appid)
+#wx.mp.appId=wx04d471b59982c6ad
+wx.mp.appId=wx98b14fca082bc468
+#(公众号的appsecret)
+#wx.mp.secret=bd9279851f63af0c67e8bc1ef7e27257
+wx.mp.secret=a06d52b0416ff98ab57eba53ebd44c72
+#(接口配置里的Token值)
+wx.mp.token=123
+#(接口配置里的EncodingAESKey值)
+wx.mp.aesKey=123
+#(获取code的认证回调接口)
+#wx.auth.redirecturl=http://th.jscssui.cn/wxlogin/wap/wechat/doLogin
+#wx.auth.redirecturl=http://wx.h.gyhywa.com/mtsy/wap/wechat/doLogin
+wx.auth.redirecturl=http://wx.z.gyhywa.com/mtsy/wap/wechat/doLogin
+#(认证成功后的跳转地址)
+wx.auth.forwardurl=http://www.hywa.com/index.html?userId=
+
+
+#export excel file
+#export.file.excel.path=C:/nginx-1.15.2/html/excelMode/
+export.file.excel.path=G:/mt/excelMode/
+
+#wlw.address=http://172.16.90.10:81
+wlw.address=http://47.111.224.169:8085

+ 64 - 0
src/main/resources/application-pro.properties

@@ -0,0 +1,64 @@
+server.port=8081
+spring.application.name=traced-web
+spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
+spring.jackson.time-zone=GMT+8
+
+#zuul timeout setting
+zuul.host.connect-timeout-millis=10000
+zuul.host.socket-timeout-millis=10000
+
+## upload files setting
+spring.http.multipart.maxFileSize=10Mb
+spring.http.multipart.maxRequestSize=10Mb
+img.location=/home/appServer/trace/upload/
+spring.mvc.static-path-pattern=/**
+spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,file:${img.location}
+
+#hystix timeout setting
+feign.hystrix.enabled=true
+#feign调用默认是1000毫秒=1秒   应该设置成更长时间1000 * 60 * 5  = 5分钟  add by six-vision
+hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=300000
+hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=300000
+hystrix.command.default.circuitBreaker.forceClosed=true
+#hystrix.command.default.execution.timeout.enabled=false
+#请求处理的超时时间  add by six-vision
+ribbon.ReadTimeout=300000
+ribbon.SocketTimeout=300000
+#请求连接的超时时间 add by six-vision
+ribbon.ConnectTimeout=30000
+# eureka setting
+eureka.instance.hostname=localhost
+eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/
+
+###redis配置#########
+spring.redis.database=0
+spring.redis.host=127.0.0.1
+spring.redis.port=6379
+spring.redis.pool.max-idle=8
+spring.redis.pool.min-idle=0
+spring.redis.pool.max-active=10
+spring.redis.pool.max-wait=-1
+spring.redis.timeout=5000
+
+#wechat setting
+#(一个公众号的appid)
+#wx.mp.appId=wx04d471b59982c6ad
+wx.mp.appId=wx39d5c079dc8d4d7d
+#(公众号的appsecret)
+#wx.mp.secret=bd9279851f63af0c67e8bc1ef7e27257
+wx.mp.secret=4b35520f8abd38e34ea685d7a717ec7f
+#(接口配置里的Token值)
+wx.mp.token=123
+#(接口配置里的EncodingAESKey值)
+wx.mp.aesKey=123
+#(获取code的认证回调接口)
+#wx.auth.redirecturl=http://zljg.jscssui.cn/api/sys/wechat/doLogin
+#wx.auth.redirecturl=http://wx.h.gyhywa.com/mtsy/wap/wechat/doLogin
+wx.auth.redirecturl= http://wx.sy.zhuxiangmiye.com/mtsy/wap/wechat/doLogin
+#(认证成功后的跳转地址)
+wx.auth.forwardurl=http://spzl.xwnykzs.com/#/ready/
+
+#export excel file
+export.file.excel.path=/home/appServer/trace/excelMode/
+
+wlw.address=http://47.111.224.169:8085

+ 60 - 0
src/main/resources/application-test.properties

@@ -0,0 +1,60 @@
+server.port=21008
+spring.application.name=traced-web
+spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
+spring.jackson.time-zone=GMT+8
+
+## upload files setting
+spring.http.multipart.maxFileSize=10Mb
+spring.http.multipart.maxRequestSize=10Mb
+img.location=/home/project/traced/upload/
+spring.mvc.static-path-pattern=/**
+spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,file:${img.location}
+
+
+#zuul timeout setting
+zuul.host.connect-timeout-millis=10000
+zuul.host.socket-timeout-millis=10000
+
+#hystix timeout setting
+feign.hystrix.enabled=true
+#feign调用默认是1000毫秒=1秒   应该设置成更长时间1000 * 60 * 5  = 5分钟  add by six-vision
+hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=300000
+hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=300000
+hystrix.command.default.circuitBreaker.forceClosed=true
+#hystrix.command.default.execution.timeout.enabled=false
+#请求处理的超时时间  add by six-vision
+ribbon.ReadTimeout=300000
+ribbon.SocketTimeout=300000
+#请求连接的超时时间 add by six-vision
+ribbon.ConnectTimeout=30000
+
+# eureka setting
+eureka.instance.hostname=localhost
+eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/
+
+###redis配置#########
+spring.redis.database=0
+spring.redis.host=127.0.0.1
+spring.redis.port=6379
+spring.redis.pool.max-idle=8
+spring.redis.pool.min-idle=0
+spring.redis.pool.max-active=10
+spring.redis.pool.max-wait=-1
+spring.redis.timeout=5000
+
+#wechat setting
+#(一个公众号的appid)
+wx.mp.appId=wx04d471b59982c6ad
+#(公众号的appsecret)
+wx.mp.secret=bd9279851f63af0c67e8bc1ef7e27257
+#(接口配置里的Token值)
+wx.mp.token=123
+#(接口配置里的EncodingAESKey值)
+wx.mp.aesKey=123
+#(获取code的认证回调接口)
+wx.auth.redirecturl=http://th.jscssui.cn/wxlogin/wap/wechat/doLogin
+#(认证成功后的跳转地址)
+wx.auth.forwardurl=http://spzl.xwnykzs.com/#/ready/
+
+#export excel file
+export.file.excel.path=/home/project/traced/excelMode/

+ 3 - 0
src/main/resources/application.properties

@@ -0,0 +1,3 @@
+spring.profiles.active=dev
+logging.level.com.hcloud=debug
+spring.devtools.restart.enabled=true

+ 0 - 0
src/main/resources/excelMode/excelMode.xls


+ 0 - 0
src/main/resources/excelMode/nexExcelMode.xls


+ 54 - 0
src/main/resources/swagger-ui.html

@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>Swagger UI</title>
+    <link rel="icon" type="image/png" href="webjars/springfox-swagger-ui/images/favicon-32x32.png" sizes="32x32"/>
+    <link rel="icon" type="image/png" href="webjars/springfox-swagger-ui/images/favicon-16x16.png" sizes="16x16"/>
+    <link href='webjars/springfox-swagger-ui/css/typography.css' media='screen' rel='stylesheet' type='text/css'/>
+    <link href='webjars/springfox-swagger-ui/css/reset.css' media='screen' rel='stylesheet' type='text/css'/>
+    <link href='webjars/springfox-swagger-ui/css/screen.css' media='screen' rel='stylesheet' type='text/css'/>
+    <link href='webjars/springfox-swagger-ui/css/reset.css' media='print' rel='stylesheet' type='text/css'/>
+    <link href='webjars/springfox-swagger-ui/css/print.css' media='print' rel='stylesheet' type='text/css'/>
+
+    <script src='webjars/springfox-swagger-ui/lib/object-assign-pollyfill.js' type='text/javascript'></script>
+    <script src='webjars/springfox-swagger-ui/lib/jquery-1.8.0.min.js' type='text/javascript'></script>
+    <script src='webjars/springfox-swagger-ui/lib/jquery.slideto.min.js' type='text/javascript'></script>
+    <script src='webjars/springfox-swagger-ui/lib/jquery.wiggle.min.js' type='text/javascript'></script>
+    <script src='webjars/springfox-swagger-ui/lib/jquery.ba-bbq.min.js' type='text/javascript'></script>
+    <script src='webjars/springfox-swagger-ui/lib/handlebars-4.0.5.js' type='text/javascript'></script>
+    <script src='webjars/springfox-swagger-ui/lib/lodash.min.js' type='text/javascript'></script>
+    <script src='webjars/springfox-swagger-ui/lib/backbone-min.js' type='text/javascript'></script>
+    <script src='webjars/springfox-swagger-ui/swagger-ui.min.js' type='text/javascript'></script>
+    <script src='webjars/springfox-swagger-ui/lib/highlight.9.1.0.pack.js' type='text/javascript'></script>
+    <script src='webjars/springfox-swagger-ui/lib/highlight.9.1.0.pack_extended.js' type='text/javascript'></script>
+    <script src='webjars/springfox-swagger-ui/lib/jsoneditor.min.js' type='text/javascript'></script>
+    <script src='webjars/springfox-swagger-ui/lib/marked.js' type='text/javascript'></script>
+    <script src='webjars/springfox-swagger-ui/lib/swagger-oauth.js' type='text/javascript'></script>
+    <script src='webjars/springfox-swagger-ui/springfox.js' type='text/javascript'></script>
+
+    <!--国际化操作:选择中文版 -->
+    <script src='webjars/springfox-swagger-ui/lang/translator.js' type='text/javascript'></script>
+    <script src='webjars/springfox-swagger-ui/lang/zh-cn.js' type='text/javascript'></script>
+
+</head>
+
+<body class="swagger-section">
+<div id='header'>
+    <div class="swagger-ui-wrap">
+        <a id="logo" href="http://swagger.io">![](webjars/springfox-swagger-ui/images/logo_small.png)<span class="logo__title">swagger</span></a>
+        <form id='api_selector'>
+            <div class='input'>
+                <select id="select_baseUrl" name="select_baseUrl"></select>
+            </div>
+            <div class='input'><input placeholder="http://example.com/api" id="input_baseUrl" name="baseUrl" type="text"/></div>
+            <div id='auth_container'></div>
+            <div class='input'><a id="explore" class="header__btn" href="#" data-sw-translate>Explore</a></div>
+        </form>
+    </div>
+</div>
+
+<div id="message-bar" class="swagger-ui-wrap" data-sw-translate> </div>
+<div id="swagger-ui-container" class="swagger-ui-wrap"></div>
+</body>
+</html>

+ 16 - 0
src/test/java/com/hcloud/microservice/traced/TracedSourceWebApplicationTests.java

@@ -0,0 +1,16 @@
+package com.hcloud.microservice.traced;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+
+public class TracedSourceWebApplicationTests {
+
+
+    public void contextLoads() {
+    }
+
+}
+

+ 42 - 0
src/test/java/com/hcloud/microservice/traced/web/SysManagerControllerTest.java

@@ -0,0 +1,42 @@
+package com.hcloud.microservice.traced.web;
+
+import com.alibaba.fastjson.JSONObject;
+import com.hcloud.microservice.org.facade.forms.BaseAuthForm;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.MvcResult;
+
+import static org.junit.Assert.*;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+@Slf4j
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@AutoConfigureMockMvc
+public class SysManagerControllerTest {
+
+    @Autowired
+    private MockMvc mockMvc;
+
+    @Test
+    public void getAuth() throws Exception {
+        BaseAuthForm baseAuthForm = new BaseAuthForm();
+        baseAuthForm.setFunName("权限");
+        MvcResult result = mockMvc.perform(post("/sysmanager/searchByPage").
+                contentType(MediaType.APPLICATION_JSON_UTF8).
+                content(JSONObject.toJSONString(baseAuthForm))).andExpect(status().isOk()).
+                andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)).andReturn();
+        log.info("======================>{}",result.getResponse().getContentAsString());
+    }
+
+
+}