Browse Source

Merge remote-tracking branch 'origin/master'

WH01243 2 years ago
parent
commit
46fd2b3766

+ 2 - 2
Makefile

@@ -59,7 +59,7 @@ build_rpc_linux:
 #编辑rpc--win
 #编辑rpc--win
 build_rpc_win:
 build_rpc_win:
 	@echo "===========> windows go build rpc "
 	@echo "===========> windows go build rpc "
-	go build -ldflags="-s -w"  -o ${RPC_WIN_FILE} ./rpc//medical/medical.go
+	go build -ldflags="-s -w"  -o ${RPC_WIN_FILE} ./rpc/medical/medical.go
 
 
 #单元测试覆盖率
 #单元测试覆盖率
 cover_out:
 cover_out:
@@ -67,7 +67,7 @@ cover_out:
 	cd service/ &&  go test -v -covermode=count -coverprofile=test_cover.out
 	cd service/ &&  go test -v -covermode=count -coverprofile=test_cover.out
 cover_html:
 cover_html:
 	@echo "===========> Run go test "
 	@echo "===========> Run go test "
-	cd service/ &&   go tool cover -html=test_cover.out -o coverage.html
+	cd service/ &&   go tool cover -html=test_cover.out -o ../doc/coverage.html
 
 
 #清理
 #清理
 clean:
 clean:

+ 992 - 0
doc/coverage.html

@@ -0,0 +1,992 @@
+
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+		<title>service: Go Coverage Report</title>
+		<style>
+			body {
+				background: black;
+				color: rgb(80, 80, 80);
+			}
+			body, pre, #legend span {
+				font-family: Menlo, monospace;
+				font-weight: bold;
+			}
+			#topbar {
+				background: black;
+				position: fixed;
+				top: 0; left: 0; right: 0;
+				height: 42px;
+				border-bottom: 1px solid rgb(80, 80, 80);
+			}
+			#content {
+				margin-top: 50px;
+			}
+			#nav, #legend {
+				float: left;
+				margin-left: 10px;
+			}
+			#legend {
+				margin-top: 12px;
+			}
+			#nav {
+				margin-top: 10px;
+			}
+			#legend span {
+				margin: 0 5px;
+			}
+			.cov0 { color: rgb(192, 0, 0) }
+.cov1 { color: rgb(128, 128, 128) }
+.cov2 { color: rgb(116, 140, 131) }
+.cov3 { color: rgb(104, 152, 134) }
+.cov4 { color: rgb(92, 164, 137) }
+.cov5 { color: rgb(80, 176, 140) }
+.cov6 { color: rgb(68, 188, 143) }
+.cov7 { color: rgb(56, 200, 146) }
+.cov8 { color: rgb(44, 212, 149) }
+.cov9 { color: rgb(32, 224, 152) }
+.cov10 { color: rgb(20, 236, 155) }
+
+		</style>
+	</head>
+	<body>
+		<div id="topbar">
+			<div id="nav">
+				<select id="files">
+				
+				<option value="file0">bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/AuthService.go (77.4%)</option>
+				
+				<option value="file1">bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.go (88.6%)</option>
+				
+				<option value="file2">bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/claim.go (100.0%)</option>
+				
+				<option value="file3">bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/portrait.go (21.8%)</option>
+				
+				</select>
+			</div>
+			<div id="legend">
+				<span>not tracked</span>
+			
+				<span class="cov0">no coverage</span>
+				<span class="cov1">low coverage</span>
+				<span class="cov2">*</span>
+				<span class="cov3">*</span>
+				<span class="cov4">*</span>
+				<span class="cov5">*</span>
+				<span class="cov6">*</span>
+				<span class="cov7">*</span>
+				<span class="cov8">*</span>
+				<span class="cov9">*</span>
+				<span class="cov10">high coverage</span>
+			
+			</div>
+		</div>
+		<div id="content">
+		
+		<pre class="file" id="file0" style="display: none">package service
+
+import (
+        "app.yhyue.com/moapp/jybase/date"
+        "app.yhyue.com/moapp/jybase/go-xweb/log"
+        "app.yhyue.com/moapp/jybase/mysql"
+        "bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/entity"
+        "bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/rpc/medical/medical"
+        "bp.jydev.jianyu360.cn/BaseService/resourceCenter/rpc/resource"
+        "context"
+        "database/sql"
+        "fmt"
+)
+
+type AuthService struct {
+        GoodsCode   string
+        GoodsSpecId int64
+        BasesqlConn *mysql.Mysql
+}
+
+//认证信息保存
+func (b AuthService) UserAuthInfoSave(in *medical.UserInfo) (bool, string) <span class="cov10" title="4">{
+        //先判断用户是否存在
+        user := b.BasesqlConn.FindOne(entity.DOMAIN_CAPITAL_RETENTION, map[string]interface{}{
+                "user_id": in.UserId, "appid": in.Appid,
+        }, "id", "")
+        if user != nil </span><span class="cov8" title="3">{
+                if in.OperationType == "add" </span><span class="cov1" title="1">{
+                        return false, "用户已验证"
+                }</span>
+        } else<span class="cov1" title="1"> {
+                if in.OperationType == "update" </span><span class="cov0" title="0">{
+                        return false, "用户未认证,不可修改"
+                }</span>
+        }
+
+        <span class="cov8" title="3">if in.OperationType == "update" </span><span class="cov5" title="2">{
+                //修改处理
+                data := map[string]interface{}{
+                        "name":       in.Name,
+                        "phone":      in.Phone,
+                        "position":   in.Position,
+                        "department": in.Department,
+                        "mail":       in.Mail,
+                        "ent_name":   in.EntName,
+                        "source":     entity.MEDICALDOMAIN,
+                }
+                ok1 := b.BasesqlConn.Update(entity.DOMAIN_CAPITAL_RETENTION, map[string]interface{}{"user_id": in.UserId, "appid": in.Appid, "source": entity.MEDICALDOMAIN}, data)
+                if ok1 </span><span class="cov5" title="2">{
+                        return true, ""
+                }</span> else<span class="cov0" title="0"> {
+                        log.Println(fmt.Sprintf("认证修改失败:入参:%v:%v,", in.UserId, data))
+                        return false, "修改失败"
+                }</span>
+        } else<span class="cov1" title="1"> {
+                //新增处理
+                data := map[string]interface{}{
+                        "name":        in.Name,
+                        "phone":       in.Phone,
+                        "position":    in.Position,
+                        "department":  in.Department,
+                        "mail":        in.Mail,
+                        "ent_name":    in.EntName,
+                        "user_id":     in.UserId,
+                        "create_time": date.NowFormat(date.Date_Full_Layout),
+                        "appid":       in.Appid,
+                        "source":      entity.MEDICALDOMAIN,
+                }
+                msg := ""
+                ok := b.BasesqlConn.ExecTx("认证信息保存", func(tx *sql.Tx) bool </span><span class="cov1" title="1">{
+                        ok1 := b.BasesqlConn.InsertByTx(tx, entity.DOMAIN_CAPITAL_RETENTION, data)
+                        if ok1 &lt;= 0 </span><span class="cov0" title="0">{
+                                log.Println(fmt.Sprintf("认证失败:参数:%v", data))
+                                msg = "认证信息保存失败"
+                                return false
+                        }</span>
+                        //开通权益
+                        <span class="cov1" title="1">req := &amp;resource.PowerReq{
+                                Appid:       in.Appid,
+                                GoodsCode:   b.GoodsCode,
+                                GoodsSpecId: b.GoodsSpecId,
+                                EntId:       0,
+                                UserId:      in.UserId,
+                                BuyNum:      1,
+                                Type:        int64(1),
+                        }
+                        resq, err := entity.ResourceLib.PowerHandle(context.Background(), req)
+                        if err != nil || resq.Status != 1 </span><span class="cov1" title="1">{
+                                log.Println("权益开通调用失败:", req, resq)
+                                msg = "权益开通调用失败"
+                                return false
+                        }</span>
+                        <span class="cov0" title="0">return ok1 &gt; 0</span>
+                })
+                <span class="cov1" title="1">return ok, msg</span>
+        }
+}
+
+//认证信息查询
+func (b AuthService) UserAuthInfo(in *medical.CommonReq) *map[string]interface{} <span class="cov5" title="2">{
+        //先判断用户是否存在
+        user := b.BasesqlConn.FindOne(entity.DOMAIN_CAPITAL_RETENTION, map[string]interface{}{
+                "user_id": in.UserId, "appid": in.Appid, "source": entity.MEDICALDOMAIN,
+        }, "*", "")
+        return user
+}</span>
+</pre>
+		
+		<pre class="file" id="file1" style="display: none">package service
+
+import (
+        quitl "app.yhyue.com/moapp/jybase/common"
+        elastic "app.yhyue.com/moapp/jybase/esv1"
+        "app.yhyue.com/moapp/jybase/mysql"
+        "bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/entity"
+        "bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/rpc/medical/medical"
+        "fmt"
+        "log"
+        "strings"
+)
+
+type InstitutionService struct {
+        Bidfield   string
+        BasesqlCon *mysql.Mysql
+        MysqlConn  *mysql.Mysql
+}
+
+// GetFilterItem 医疗机构搜索条件
+func (b InstitutionService) GetFilterItem() (levelList, typeList *[]map[string]interface{}) <span class="cov1" title="1">{
+        //机构类型
+        levelSql := fmt.Sprintf("select  * from %s where  name!='%s'", entity.CODE_MEDICAL_INSTITUTION_LEVEL, "其它")
+        levelList = b.MysqlConn.SelectBySql(levelSql)
+        //医院等级
+        typeSql := fmt.Sprintf("select  * from %s where  name!='%s' and  level=1", entity.CODE_MEDICAL_INSTITUTION_TYPE, "其它")
+        typeList = b.MysqlConn.SelectBySql(typeSql)
+        return
+}</span>
+
+// Institution 医疗机构搜索条件
+func (b InstitutionService) Institution(in *medical.SearchInstitutionReq) (dataList []map[string]interface{}) <span class="cov1" title="1">{
+        //先查询医疗机构
+        //医疗机构查询拼接
+        query := `{"query":{"bool":{"must":[%s],"must_not": [{"term": {"p_miname": ""}}],"should":[%s],"minimum_should_match": %d}},"sort":{"id":{"order":"desc"}}, "from": %d,"size": %d}`
+        shouldQuery := `{"bool":{"should":[%s],"minimum_should_match": %d}}`
+        multi_match := `{"multi_match": {"query": %s,"type": "phrase", "fields": [%s]}}`
+        musts := []string{}
+        var query_bool_must_and = `{"bool": {"must": [%s]%s}}`
+        shoulds := []string{}
+        bools := []string{}
+        //省份处理
+        cityArr := []string{}
+        areaArr := []string{}
+        if in.AreaCode != "" </span><span class="cov1" title="1">{
+                areaCode := quitl.ObjToMap(in.AreaCode)
+                for k, v := range *areaCode </span><span class="cov3" title="2">{
+                        if len(quitl.ObjArrToStringArr(v.([]interface{}))) == 0 </span><span class="cov1" title="1">{
+                                areaArr = append(areaArr, k)
+                        }</span> else<span class="cov1" title="1"> {
+                                cityArr = append(cityArr, quitl.ObjArrToStringArr(v.([]interface{}))...)
+                        }</span>
+                }
+        }
+
+        //省份处理
+        <span class="cov1" title="1">if len(areaArr) &gt; 0 </span><span class="cov1" title="1">{
+                areaQuery := entity.SplicingArr("area", areaArr)
+                shoulds = append(shoulds, areaQuery)
+        }</span>
+        //城市处理
+        <span class="cov1" title="1">if len(cityArr) &gt; 0 </span><span class="cov1" title="1">{
+                cityQuery := entity.SplicingArr("city", cityArr)
+                shoulds = append(shoulds, cityQuery)
+        }</span>
+        //医疗等级处理
+        <span class="cov1" title="1">if in.LevelCode != "" </span><span class="cov1" title="1">{
+                levelQuery := entity.SplicingString("level_code", in.LevelCode)
+                musts = append(musts, levelQuery)
+        }</span>
+        //机构类型处理
+        <span class="cov1" title="1">if in.MiTypeCode != "" </span><span class="cov1" title="1">{
+                miTyprQuery := entity.SplicingString("mi_type_code", in.MiTypeCode)
+                musts = append(musts, miTyprQuery)
+        }</span>
+        //经营性质处理
+        <span class="cov1" title="1">if in.BusinessTypeCode != "" </span><span class="cov1" title="1">{
+                businessTypeQuery := entity.SplicingString("business_type", in.BusinessTypeCode)
+                musts = append(musts, businessTypeQuery)
+        }</span>
+        //机构名称处理
+        <span class="cov1" title="1">if in.CompanyName != "" </span><span class="cov1" title="1">{
+                /*companyNameQuery := entity.SplicingString("p_miname", in.CompanyName)
+                musts = append(musts, companyNameQuery)*/
+                musts = append(musts, fmt.Sprintf(multi_match, "\""+in.CompanyName+"\"", "\"p_miname\""))
+        }</span>
+        //业务范围处理
+        <span class="cov1" title="1">boolsNum, bools := BusinessScopehandle(in.SdequipmentCode, multi_match, `"sdequipment"`, query_bool_must_and, bools)
+        shouldNumber := 0
+        if len(shoulds) &gt; 0 </span><span class="cov1" title="1">{
+                shouldNumber = 1
+        }</span>
+        <span class="cov1" title="1">shouldStr := fmt.Sprintf(shouldQuery, strings.Join(shoulds, ","), shouldNumber)
+        musts = append(musts, shouldStr)
+        queryStr := fmt.Sprintf(query, strings.Join(musts, ","), strings.Join(bools, ","), boolsNum, 0, in.ResourceUseCount)
+        //医疗机构查找
+        companyList := elastic.Get(entity.INSTITUTION_INDEX, entity.INSTITUTION_TYPE, queryStr)
+        log.Println(queryStr)
+        //再根据医疗机构名称查找项目金额总数
+        companyName := ""
+        companyMap := make(map[string]map[string]interface{})
+        if len(*companyList) &gt; 0 &amp;&amp; companyList != nil </span><span class="cov1" title="1">{
+                //认领数据查询
+                companyIdMap := b.ClaimCompanyData(in.Appid, in.NewUserId, entity.TypeInstitution)
+                for key, value := range *companyList </span><span class="cov10" title="14">{
+                        if key &gt; 0 </span><span class="cov9" title="13">{
+                                companyName += `,`
+                        }</span>
+                        <span class="cov10" title="14">companyName += `"` + fmt.Sprint(value["mi_name"]) + `"`
+                        value["project_money"] = float64(0.00)
+                        value["project_count"] = 0
+                        if companyIdMap[fmt.Sprint(value["company_id"])] == nil </span><span class="cov10" title="14">{
+                                value["isClaim"] = false
+                        }</span> else<span class="cov0" title="0"> {
+                                value["isClaim"] = true
+                        }</span>
+                        <span class="cov10" title="14">companyMap[fmt.Sprint(value["mi_name"])] = value</span>
+                }
+
+        } else<span class="cov0" title="0"> {
+                return
+        }</span>
+        <span class="cov1" title="1">orderField := "_count"
+        orderType := "desc"
+        //排序处理
+        if in.Sort == 1 </span><span class="cov0" title="0">{
+                orderField = "count"
+        }</span>
+        <span class="cov1" title="1">aggStr := fmt.Sprintf(`{"query":{"bool":{"must":[{"terms":{"buyer":[%s]}},{"terms":{"bidstatus":["中标","成交","合同"]}},{"term":{"bid_field":"%s"}}],"minimum_should_match":0}},"aggs":{"group_field":{"terms":{"field":"buyer","order":[{"%s":"%s"}]},"aggs":{"count":{"sum":{"field":"bidamount"}}}}},"size":0}`, companyName, b.Bidfield, orderField, orderType)
+        log.Println(aggStr)
+        countList := entity.GetAggs(entity.PROJECTSET_INDEX, entity.PROJECTSET_TYPE, aggStr)
+        //
+        if len(countList) &gt; 0 &amp;&amp; countList != nil </span><span class="cov1" title="1">{
+                for _, value := range countList </span><span class="cov3" title="2">{
+                        if companyMap[value.CompanyName] != nil </span><span class="cov3" title="2">{
+                                companyMap[value.CompanyName]["project_money"] = value.ProjectMoney
+                                companyMap[value.CompanyName]["project_count"] = value.ProjectCount
+                                dataList = append(dataList, companyMap[value.CompanyName])
+                                delete(companyMap, value.CompanyName)
+                        }</span>
+                }
+                <span class="cov1" title="1">for _, value := range companyMap </span><span class="cov9" title="12">{
+                        dataList = append(dataList, value)
+                }</span>
+        } else<span class="cov0" title="0"> {
+                dataList = *companyList
+
+        }</span>
+        <span class="cov1" title="1">return</span>
+}
+
+// Distributor 经销商搜索
+func (b InstitutionService) Distributor(in *medical.SearchDistributorReq) (dataList []map[string]interface{}) <span class="cov1" title="1">{
+        //先查询医疗机构
+        //医疗机构查询拼接
+        query := `{"query":{"bool":{"must":[%s],"must_not": [{"term": {"p_supplier": ""}}],"should":[%s],"minimum_should_match": %d}}, "sort":{"id":{"order":"desc"}},"from": %d,"size": %d}`
+        shouldQuery := `{"bool":{"should":[%s],"minimum_should_match": %d}}`
+        multi_match := `{"multi_match": {"query": %s,"type": "phrase", "fields": [%s]}}`
+        var query_bool_must_and = `{"bool": {"must": [%s]%s}}`
+        musts := []string{}
+        shoulds := []string{}
+        bools := []string{}
+        //省份处理
+        cityArr := []string{}
+        areaArr := []string{}
+        if in.AreaCode != "" </span><span class="cov1" title="1">{
+                areaCode := quitl.ObjToMap(in.AreaCode)
+                for k, v := range *areaCode </span><span class="cov3" title="2">{
+                        if len(quitl.ObjArrToStringArr(v.([]interface{}))) == 0 </span><span class="cov1" title="1">{
+                                areaArr = append(areaArr, k)
+                        }</span> else<span class="cov1" title="1"> {
+                                cityArr = append(cityArr, quitl.ObjArrToStringArr(v.([]interface{}))...)
+                        }</span>
+                }
+        }
+        //省份处理
+        <span class="cov1" title="1">if len(areaArr) &gt; 0 </span><span class="cov1" title="1">{
+                areaQuery := entity.SplicingArr("area", areaArr)
+                shoulds = append(shoulds, areaQuery)
+        }</span>
+        //城市处理
+        <span class="cov1" title="1">if len(cityArr) &gt; 0 </span><span class="cov1" title="1">{
+                cityQuery := entity.SplicingArr("city", cityArr)
+                shoulds = append(shoulds, cityQuery)
+        }</span>
+        //业务范围处理
+        <span class="cov1" title="1">boolsNum, bools := BusinessScopehandle(in.BusinessScope, multi_match, `"productlist.name"`, query_bool_must_and, bools)
+        //品牌处理
+        if in.Brand != "" </span><span class="cov0" title="0">{
+                brandQuery := entity.SplicingString("productlist.brand", in.Brand)
+                musts = append(musts, brandQuery)
+        }</span>
+        //产品型号处理
+        <span class="cov1" title="1">if in.ProductModel != "" </span><span class="cov0" title="0">{
+                productModelQuery := entity.SplicingString("productlist.model", in.ProductModel)
+                musts = append(musts, productModelQuery)
+        }</span>
+        //机构名称处理
+        <span class="cov1" title="1">if in.CompanyName != "" </span><span class="cov1" title="1">{
+                musts = append(musts, fmt.Sprintf(multi_match, "\""+in.CompanyName+"\"", "\"p_supplier\""))
+        }</span>
+        <span class="cov1" title="1">shouldNumber := 0
+        if len(shoulds) &gt; 0 </span><span class="cov1" title="1">{
+                shouldNumber = 1
+        }</span>
+        <span class="cov1" title="1">shouldStr := fmt.Sprintf(shouldQuery, strings.Join(shoulds, ","), shouldNumber)
+        musts = append(musts, shouldStr)
+        queryStr := fmt.Sprintf(query, strings.Join(musts, ","), strings.Join(bools, ","), boolsNum, 0, in.ResourceUseCount)
+        //医疗机构查找
+        companyList := elastic.Get(entity.SUPPLIER_PRODUCT_INDEX, entity.SUPPLIER_PRODUCT_TYPE, queryStr)
+        log.Println(queryStr)
+        //再根据医疗机构名称查找项目金额总数
+        companyIds := ""
+        companyMap := make(map[string]map[string]interface{})
+        if len(*companyList) &gt; 0 &amp;&amp; companyList != nil </span><span class="cov1" title="1">{
+                //认领数据查询
+                companyIdMap := b.ClaimCompanyData(in.Appid, in.NewUserId, entity.TypeDistributor)
+                for key, value := range *companyList </span><span class="cov7" title="7">{
+                        if key &gt; 0 </span><span class="cov7" title="6">{
+                                companyIds += `,`
+                        }</span>
+                        <span class="cov7" title="7">companyIds += `"` + fmt.Sprint(value["company_id"]) + `"`
+                        value["project_money"] = float64(0.00)
+                        value["project_count"] = 0
+                        if companyIdMap[fmt.Sprint(value["company_id"])] == nil </span><span class="cov7" title="7">{
+                                value["isClaim"] = false
+                        }</span> else<span class="cov0" title="0"> {
+                                value["isClaim"] = true
+                        }</span>
+                        <span class="cov7" title="7">companyMap[fmt.Sprint(value["company_id"])] = value</span>
+                }
+        } else<span class="cov0" title="0"> {
+                return
+        }</span>
+        //排序处理
+        <span class="cov1" title="1">orderField := "_count"
+        orderType := "desc"
+        if in.Sort == 1 </span><span class="cov0" title="0">{
+                orderField = "count"
+        }</span>
+        <span class="cov1" title="1">aggStr := fmt.Sprintf(`{"query":{"bool":{"must":[{"terms":{"entidlist":[%s]}},{"terms":{"bidstatus":["中标","成交","合同"]}},{"term":{"bid_field":"%s"}}],"minimum_should_match":0}},"aggs":{"group_field":{"terms":{"field":"entidlist","order":[{"%s":"%s"}]},"aggs":{"count":{"sum":{"field":"bidamount"}}}}},"size":0}`, companyIds, b.Bidfield, orderField, orderType)
+        log.Println(aggStr)
+        countList := entity.GetAggs(entity.PROJECTSET_INDEX, entity.PROJECTSET_TYPE, aggStr)
+        if len(countList) &gt; 0 &amp;&amp; countList != nil </span><span class="cov0" title="0">{
+                for _, value := range countList </span><span class="cov0" title="0">{
+                        if companyMap[value.CompanyName] != nil </span><span class="cov0" title="0">{
+                                companyMap[value.CompanyName]["project_money"] = value.ProjectMoney
+                                companyMap[value.CompanyName]["project_count"] = value.ProjectCount
+                                dataList = append(dataList, companyMap[value.CompanyName])
+                                delete(companyMap, value.CompanyName)
+                        }</span>
+                }
+                <span class="cov0" title="0">for _, value := range companyMap </span><span class="cov0" title="0">{
+                        dataList = append(dataList, value)
+                }</span>
+        } else<span class="cov1" title="1"> {
+                dataList = *companyList
+        }</span>
+        <span class="cov1" title="1">return</span>
+}
+
+//  ClaimCompanyData 已认领企业查询处理
+//  @Description:
+//  @param appId 用户标识
+//  @param newUserId 用户标识
+//  @param claimType 数据类型
+//  @return map[string]map[string]interface{} 认领的企业信息
+//
+func (b InstitutionService) ClaimCompanyData(appId string, newUserId, claimType int64) map[string]map[string]interface{} <span class="cov5" title="4">{
+        claimList := b.BasesqlCon.Find(entity.TableDomainEntClaim, map[string]interface{}{
+                "user_id": newUserId,
+                "status":  1,
+                "type":    claimType,
+                "appid":   appId,
+        }, "ent_id", "", -1, -1)
+        companyIdMap := make(map[string]map[string]interface{})
+        if claimList == nil || len(*claimList) == 0 </span><span class="cov0" title="0">{
+                return companyIdMap
+        }</span>
+        <span class="cov5" title="4">for _, m := range *claimList </span><span class="cov5" title="4">{
+                companyIdMap[quitl.InterfaceToStr(m["ent_id"])] = m
+        }</span>
+        <span class="cov5" title="4">return companyIdMap</span>
+}
+
+// BusinessScopehandle 业务范围处理
+func BusinessScopehandle(BusinessScope []*medical.Business_Scope, multi_match, findfields, query_bool_must_and string, bools []string) (int, []string) <span class="cov3" title="2">{
+        boolsNum := 0
+        if len(BusinessScope) &gt; 0 </span><span class="cov3" title="2">{
+                boolsNum = 1
+
+                multi_match = fmt.Sprintf(multi_match, "%s", findfields)
+                for _, v := range BusinessScope </span><span class="cov4" title="3">{
+                        businessShoulds := []string{}
+                        businessMust_not := []string{}
+                        //关键词
+                        for _, keyV := range v.Key </span><span class="cov4" title="3">{
+                                businessShoulds = append(businessShoulds, fmt.Sprintf(multi_match, "\""+keyV+"\""))
+                        }</span>
+                        //附加词
+                        <span class="cov4" title="3">for _, AppendV := range v.Appendkey </span><span class="cov1" title="1">{
+                                businessShoulds = append(businessShoulds, fmt.Sprintf(multi_match, "\""+AppendV+"\""))
+                        }</span>
+                        //排除词
+                        <span class="cov4" title="3">for _, notV := range v.Notkey </span><span class="cov7" title="6">{
+                                businessMust_not = append(businessMust_not, fmt.Sprintf(multi_match, "\""+notV+"\""))
+                        }</span>
+                        //添加
+                        <span class="cov4" title="3">if len(businessShoulds) &gt; 0 </span><span class="cov4" title="3">{
+                                notStr := ""
+                                if len(businessShoulds) &gt; 0 </span><span class="cov4" title="3">{
+                                        notStr = fmt.Sprintf(`,"must_not":[%s]`, strings.Join(businessMust_not, ","))
+                                }</span>
+                                <span class="cov4" title="3">bools = append(bools, fmt.Sprintf(query_bool_must_and, strings.Join(businessShoulds, ","), notStr))</span>
+                        }
+                }
+        }
+        <span class="cov3" title="2">return boolsNum, bools</span>
+}
+</pre>
+		
+		<pre class="file" id="file2" style="display: none">package service
+
+import (
+        "app.yhyue.com/moapp/jybase/common"
+        "app.yhyue.com/moapp/jybase/date"
+        "bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/entity"
+        "fmt"
+        "github.com/zeromicro/go-zero/core/logx"
+        "strings"
+)
+
+// EntClaimService 企业认领
+type EntClaimService struct {
+        *entity.Conn
+}
+
+// NewEntClaimSrv 创建一个EntClaimSrv实例
+func NewEntClaimSrv(conn *entity.Conn) *EntClaimService <span class="cov1" title="1">{
+        return &amp;EntClaimService{
+                conn,
+        }
+}</span>
+
+// Claim 认领
+func (e *EntClaimService) Claim(data *entity.EntClaim) (int64, error) <span class="cov7" title="4">{
+        if e.IsClaimed(data.UserId, data.AppId, data.EntId, data.Type) </span><span class="cov4" title="2">{
+                return 0, entity.RepeatErr
+        }</span>
+        <span class="cov4" title="2">return e.BaseMysql.Insert(entity.TableDomainEntClaim, common.StructToMapMore(data)), nil</span>
+}
+
+// UnclaimedByEnt 根据企业id取消认领
+func (e EntClaimService) UnclaimedByEnt(userId int, entId string, type_ int) (bool, int) <span class="cov7" title="4">{
+
+        query := map[string]interface{}{
+                "user_id": userId,
+                "status":  entity.StatusClaimed,
+                "ent_id":  entId,
+                "type":    type_,
+        }
+        // 1. 查询该条数据
+        rs := e.BaseMysql.FindOne(entity.TableDomainEntClaim, query, "id", "")
+        if rs == nil || len(*rs) == 0 </span><span class="cov4" title="2">{
+                logx.Errorf("取消认领:无效的企业id %v", entId)
+                return false, 0
+        }</span>
+        <span class="cov4" title="2">query2 := map[string]interface{}{
+                "id": (*rs)["id"],
+        }
+        // 2. 取消认领
+        update := map[string]interface{}{
+                "status":      entity.StatusUnClaimed,
+                "update_time": date.NowFormat(date.Date_Full_Layout),
+        }
+        return e.BaseMysql.Update(entity.TableDomainEntClaim, query2, update), common.IntAll((*rs)["id"])</span>
+}
+
+// IsClaimed 是否认领
+func (e *EntClaimService) IsClaimed(userId int, appId string, entId string, typeCode int) bool <span class="cov10" title="6">{
+        query := map[string]interface{}{
+                "appId":   appId,
+                "user_id": userId,
+                "type":    typeCode,
+                "ent_id":  entId,
+                "status":  entity.StatusClaimed,
+        }
+        return e.BaseMysql.Count(entity.TableDomainEntClaim, query) &gt; 0
+}</span>
+
+// DistributorList 关注的经销商列表
+func (e *EntClaimService) DistributorList(userId int, appId string, page int, pageSize int) (*[]map[string]interface{}, int) <span class="cov4" title="2">{
+
+        query := map[string]interface{}{
+                "user_id": userId,
+                "appid":   appId,
+                "type":    entity.TypeDistributor,
+                "status":  entity.StatusClaimed,
+        }
+        field := "id,appid,user_id,ent_id,ent_name,create_time"
+        order := "create_time desc"
+        total := e.BaseMysql.Count(entity.TableDomainEntClaim, query)
+        if total == 0 </span><span class="cov1" title="1">{
+                return nil, 0
+        }</span>
+        <span class="cov1" title="1">return e.BaseMysql.Find(entity.TableDomainEntClaim, query, field, order, (page-1)*pageSize, pageSize), int(total)</span>
+}
+
+// InstitutionList  我关注的医疗机构列表
+func (e *EntClaimService) InstitutionList(userId int, appId string, page int, pageSize int) (*[]map[string]interface{}, int) <span class="cov4" title="2">{
+        query := map[string]interface{}{
+                "user_id": userId,
+                "appid":   appId,
+                "type":    entity.TypeInstitution,
+                "status":  entity.StatusClaimed,
+        }
+        field := "id,appid,user_id,ent_id,ent_name,create_time"
+        order := "create_time desc"
+        total := e.BaseMysql.Count(entity.TableDomainEntClaim, query)
+        if total == 0 </span><span class="cov1" title="1">{
+                return nil, 0
+        }</span>
+        <span class="cov1" title="1">return e.BaseMysql.Find(entity.TableDomainEntClaim, query, field, order, (page-1)*pageSize, pageSize), int(total)</span>
+}
+
+// GetCompanyByIds   批量获取经销商详细信息
+func (e EntClaimService) GetCompanyByIds(ids []string) *[]map[string]interface{} <span class="cov6" title="3">{
+        if len(ids) == 0 </span><span class="cov1" title="1">{
+                return &amp;[]map[string]interface{}{}
+        }</span>
+        <span class="cov4" title="2">q := "select a.company_id,a.company_name,a.establish_date,a.company_address,a.capital,a.company_phone,b.area,b.city from %v a left join %v b on a.area_code=b.code  where a.company_id in (\"%v\")  "
+        query := fmt.Sprintf(q, entity.TableCompanyBasInfo, entity.TableCodeArea, strings.Join(ids, "\" , \""))
+        return e.GlobalCommonData.SelectBySql(query)</span>
+}
+
+// GetInstitutionByIds  批量获取机构详细信息
+func (e EntClaimService) GetInstitutionByIds(ids []string) *[]map[string]interface{} <span class="cov6" title="3">{
+        if len(ids) == 0 </span><span class="cov1" title="1">{
+                return &amp;[]map[string]interface{}{}
+        }</span>
+        <span class="cov4" title="2">q := "select a.company_id,a.mi_name,a.establish_date,b.area,b.city from %v.%v a left join %v.%v b on a.area_code=b.code  where a.company_id in (\"%v\")  "
+        query := fmt.Sprintf(q, entity.DbMedical, entity.TableInstitutionBaseInfo, entity.DbGlobal, entity.TableCodeArea, strings.Join(ids, "\" , \""))
+        return e.Mysql.SelectBySql(query)</span>
+}
+</pre>
+		
+		<pre class="file" id="file3" style="display: none">// @Description   画像相关
+package service
+
+import (
+        "errors"
+        "fmt"
+        "log"
+        "regexp"
+        "strings"
+        "time"
+
+        . "app.yhyue.com/moapp/jybase/common"
+        "app.yhyue.com/moapp/jybase/encrypt"
+        elastic "app.yhyue.com/moapp/jybase/esv1"
+        "bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/entity"
+)
+
+//画像
+type PortraitService struct {
+        *entity.Conn
+}
+
+var ClearHtml = regexp.MustCompile("&lt;[^&gt;]*&gt;")
+
+// @description           生成结构体
+// @param                     conn 数据库实例
+// @return                    Portrait 画像实例
+func NewPortrait(conn *entity.Conn) *PortraitService <span class="cov1" title="1">{
+        return &amp;PortraitService{
+                conn,
+        }
+}</span>
+
+// @description           获取画像内容
+// @param                     companyId 机构id
+// @param                     user_id   base_user_id
+// @return                    PortraitInfo 画像信息
+// @return                    error 错误信息
+func (this *PortraitService) Info(companyId string, user_id int64) (*entity.PortraitInfo, error) <span class="cov10" title="3">{
+        //判断是否存在companyid
+        if companyId == "" || user_id == 0 </span><span class="cov10" title="3">{
+                return nil, errors.New(entity.NO_DATA_ERROR_MSG)
+        }</span>
+        //获取信息
+        <span class="cov0" title="0">data := this.Mysql.SelectBySql(fmt.Sprintf(`SELECT a.sdequipment_code,a.area_code,a.beds,a.visit_perday,a.doctorsnum,a.address,a.website,a.business_type,replace(a.equipment,",","、") equipment, replace(e.equipment,",","、") sdleveltypeequip ,a.mi_name,a.establish_date,b.name LEVEL,c.name miType,d.class FROM %s a 
+                                                                                                        LEFT JOIN %s b ON a.level_code=b.code 
+                                                                                                        LEFT JOIN %s c ON c.code =a.mi_type_code
+                                                                                                        LEFT JOIN (SELECT GROUP_CONCAT(DISTINCT departname_class1 SEPARATOR  '、') class,company_id FROM %s WHERE company_id=?)  AS d ON d.company_id =a.company_id
+                                                                                                        left join %s e on e.code =a.sdequipment_code
+                                                                                                        WHERE  a.company_id=?`, entity.Institution_baseinfo, entity.Code_level, entity.Code_type, entity.Institution_department, entity.Code_sdleveltypeequip), companyId, companyId)
+        if data == nil || len(*data) == 0 </span><span class="cov0" title="0">{
+                return nil, errors.New(entity.NO_DATA_ERROR_MSG)
+        }</span>
+        //获取area_code 省份,城市,区县
+        <span class="cov0" title="0">area, city, district := "", "", ""
+        rdata := (*data)[0]
+        adata := this.GlobalCommonData.SelectBySql(fmt.Sprintf(`select area,city,district from %s where code =? limit 1`, entity.Code_area), ObjToString(rdata["area_code"]))
+        if adata != nil &amp;&amp; len(*adata) &gt; 0 </span><span class="cov0" title="0">{
+                area = ObjToString((*adata)[0]["area"])
+                city = ObjToString((*adata)[0]["city"])
+                district = ObjToString((*adata)[0]["district"])
+        }</span>
+        //医疗设备如果基本信息表中没有,则根据sdequipment_code、code联合查询得到equipment
+        <span class="cov0" title="0">equipment := ObjToString(rdata["equipment"])
+        sdleveltypeequip := ObjToString(rdata["sdleveltypeequip"])
+        if equipment == "" &amp;&amp; sdleveltypeequip != "" </span><span class="cov0" title="0">{
+                equipment = ObjToString(rdata["sdleveltypeequip"])
+        }</span>
+        //医疗画像结果
+        <span class="cov0" title="0">portraitInfo := &amp;entity.PortraitInfo{
+                Beds:          Int64All(rdata["beds"]),
+                VisitPerday:   Int64All(rdata["visit_perday"]),      // 门诊量/日
+                Doctorsnum:    Int64All(rdata["doctorsnum"]),        //医生人数
+                Address:       ObjToString(rdata["address"]),        //医疗机构地址
+                Website:       ObjToString(rdata["website"]),        //医疗机构网站
+                Area:          area,                                 //省
+                City:          city,                                 //市
+                District:      district,                             //区
+                BusinessType:  Int64All(rdata["business_type"]),     //医疗机构经营方式(0:公立、1:民营、2:其它)
+                Level:         ObjToString(rdata["level"]),          //医疗机构等级
+                MiType:        ObjToString(rdata["miType"]),         //医疗机构类型
+                Equipment:     equipment,                            //医院设备
+                Departnames:   ObjToString(rdata["class"]),          //医院科室
+                Follow:        this.IsFollow(companyId, user_id, 1), //是否关注 0-未关注 1已关注
+                CompanyName:   ObjToString(rdata["mi_name"]),        //医疗机构名称
+                EstablishDate: ObjToString(rdata["establish_date"]), //成立日期
+        }
+        return portraitInfo, nil</span>
+}
+
+// @description           获取医疗机构画像相关招标动态
+// @param                     companyName 机构名称
+// @param                     pageSize 条数
+// @param                     pageNum 页码
+// @param                     isExport 是否用于数据导出
+// @return                    GetNewMsgList 招标动态
+// @return                    count 招标数量
+// @return                    error 错误信息
+func (this *PortraitService) List(companyName string, pageSize, pageNum int64, isExport bool) (*[]*entity.GetNewMsgList, int64, error) <span class="cov1" title="1">{
+        //判断是否存在companyid
+        if companyName == "" </span><span class="cov0" title="0">{
+                return nil, 0, errors.New(entity.NO_DATA_ERROR_MSG)
+        }</span>
+        <span class="cov1" title="1">var total int64
+        mustQueryArr := this.CommonPare(companyName)
+        log.Println("~~~~,", mustQueryArr)
+        //仅第一页查询总量(非数据导出)
+
+        if pageNum == 1 </span><span class="cov1" title="1">{
+                total = elastic.Count(entity.BiddingIndex, entity.BiddingIndex, fmt.Sprintf(entity.NewMustSearch, strings.Join(mustQueryArr, ","), ""))
+                if total &lt;= 0 </span><span class="cov1" title="1">{
+                        return nil, 0, errors.New(entity.NO_DATA_ERROR_MSG)
+                }</span>
+        }
+        <span class="cov0" title="0">start, limit := (pageNum-1)*pageSize, pageSize
+        fields := `"title","area","subtype","_id","projectname","publishtime"`
+        if isExport </span><span class="cov0" title="0">{
+                start, limit = 0, entity.DataExportNumLimit
+                fields = `"_id","title"`
+        }</span>
+        <span class="cov0" title="0">list := &amp;[]*entity.GetNewMsgList{}
+        //列表查询
+        if total &lt;= entity.DataExportBatchSearchLimit </span><span class="cov0" title="0">{
+                listQuery := fmt.Sprintf(entity.NewMustSearch, strings.Join(mustQueryArr, ","), fmt.Sprintf(entity.ListSearchLimit, fields, "publishtime", start, limit))
+                log.Printf("PortraitWinnerProject GetList Sql %s\n", listQuery)
+                newData := elastic.Get(entity.BiddingIndex, entity.BiddingType, listQuery)
+                if newData == nil || len(*newData) == 0 </span><span class="cov0" title="0">{
+                        return nil, 0, errors.New(entity.NO_DATA_ERROR_MSG)
+                }</span>
+                <span class="cov0" title="0">log.Println("newdata:", newData)
+                for k, v := range *newData </span><span class="cov0" title="0">{
+                        if len(v) &gt; 0 </span><span class="cov0" title="0">{
+                                if v["_id"] != nil </span><span class="cov0" title="0">{
+                                        (*newData)[k]["id"] = EncodeId(v["_id"].(string))
+                                        delete((*newData)[k], "_id") //删除未加密id
+                                }</span>
+                                <span class="cov0" title="0">title := ObjToString(ObjToString(v["title"]))
+                                if title == "" </span><span class="cov0" title="0">{
+                                        title = ObjToString(v["projectname"])
+                                }</span>
+                                <span class="cov0" title="0">(*newData)[k]["title"] = ClearHtml.ReplaceAllString(title, "")</span>
+                        }
+                        <span class="cov0" title="0">*list = append(*list, &amp;entity.GetNewMsgList{
+                                Area:      ObjToString(v["area"]),
+                                Bidstatus: ObjToString(v["subtype"]),           //信息类型
+                                Firsttime: Int64All(v["publishtime"]),          //时间
+                                Id:        ObjToString((*newData)[k]["id"]),    //加密信息id
+                                Title:     ObjToString((*newData)[k]["title"]), //标题
+                        })
+                        log.Println("~~list:", list)</span>
+                }
+                <span class="cov0" title="0">return list, total, nil</span>
+        }
+        <span class="cov0" title="0">return nil, 0, errors.New(entity.NO_DATA_ERROR_MSG)</span>
+}
+
+//医疗机构画像查询语句拼接
+func (this *PortraitService) CommonPare(companyName string) (mustQueryArr []string) <span class="cov1" title="1">{
+        sTime, eTime := this.PareTimeSelect()
+        mustQueryArr = append(mustQueryArr, fmt.Sprintf(`{"term":{"buyer":"%s"}}`, companyName))
+        mustQueryArr = append(mustQueryArr, fmt.Sprintf(`{"term":{"bid_field":"%s"}}`, entity.BidField))
+        mustQueryArr = append(mustQueryArr, fmt.Sprintf(`{"range":{"publishtime":{"gte":"%d","lte":"%d"}}}`, sTime.Unix(), eTime.Unix()))
+
+        return
+}</span>
+
+//PareTimeSelect 默认2年
+func (this *PortraitService) PareTimeSelect() (st, et time.Time) <span class="cov1" title="1">{
+        now := time.Now()
+        sYear := now.Year() - 2
+        eYear := now.Year()
+        //返回默认时间
+        sTimeStamp := time.Date(sYear, 1, 1, 0, 0, 0, 0, time.Local)
+        eTimeStamp := time.Date(eYear+1, 1, 1, 0, 0, -1, 0, time.Local)
+        if eYear == now.Year() </span><span class="cov1" title="1">{
+                eTimeStamp = time.Date(eYear, now.Month(), now.Day(), now.Hour(), now.Minute(), 0, 0, time.Local)
+        }</span>
+        <span class="cov1" title="1">return sTimeStamp, eTimeStamp</span>
+}
+
+//短地址加密
+func EncodeId(sid string) string <span class="cov0" title="0">{
+        if sid == "" || sid == "-" </span><span class="cov0" title="0">{ //不存在的id为-
+                return ""
+        }</span>
+        <span class="cov0" title="0">return encrypt.EncodeArticleId2ByCheck(sid)</span>
+}
+
+// @description           判断用户是否关注该项目
+// @param                     companyId 机构id
+// @param                     user_id base_user_id
+// @param                     types 类型 1医疗机构 2经销商
+// @return                    int64 是否关注 1关注 0未关注
+func (this *PortraitService) IsFollow(companyId string, user_id, types int64) int64 <span class="cov0" title="0">{
+        if this.BaseMysql.CountBySql(fmt.Sprintf(`select count(1) from %s where user_id =? and ent_id =? and type =?`, entity.Domain_ent_claim), user_id, companyId, types) &gt; 0 </span><span class="cov0" title="0">{
+                return 1
+        }</span>
+        <span class="cov0" title="0">return 0</span>
+}
+
+// @description           获取医疗机构画像相关招标动态导出的加密戳 用于数据导出支付页面
+// @param                     mongoUid mongodb用户id
+// @param                     companyName 机构名称
+// @param                     ids 选中的招标信息 多个,隔开 全部则传空字符串
+// @return                    string 生成的数据导出加密戳
+// @return                    error 错误信息
+func (this *PortraitService) Export(mongoUid, companyName, ids string) (string, error) <span class="cov0" title="0">{
+        //判断是否存在companyid
+        if companyName == "" </span><span class="cov0" title="0">{
+                return "", errors.New(entity.NO_DATA_ERROR_MSG)
+        }</span>
+        <span class="cov0" title="0">sTime, eTime := this.PareTimeSelect()
+        idsArr := []string{}
+        if ids == "" </span><span class="cov0" title="0">{
+                //获取全部id
+                list, _, err := this.List(companyName, -1, -1, true)
+                if err != nil || list == nil || len(*list) == 0 </span><span class="cov0" title="0">{
+                        return "", errors.New(entity.NO_DATA_ERROR_MSG)
+                }</span>
+                <span class="cov0" title="0">for k, v := range *list </span><span class="cov0" title="0">{
+                        ids += v.Id
+                        if k != len(*list)-1 </span><span class="cov0" title="0">{
+                                ids += ","
+                        }</span>
+                }
+        }
+        <span class="cov0" title="0">for _, v := range strings.Split(ids, ",") </span><span class="cov0" title="0">{
+                id := encrypt.DecodeArticleId2ByCheck(v) //解密id
+                if len(id) &gt; 0 </span><span class="cov0" title="0">{
+                        //
+                        idsArr = append(idsArr, id[0])
+                }</span>
+        }
+        //
+        <span class="cov0" title="0">saveMap := map[string]interface{}{
+                "s_userid":    mongoUid,
+                "comeinfrom":  "medicalPortrait", //来源
+                "comeintime":  time.Now().Unix(),
+                "selectIds":   idsArr,
+                "area":        []string{},
+                "publishtime": fmt.Sprintf("%d_%d", sTime.Unix(), eTime.Unix()),
+                "industry":    []string{},
+                "keywords":    []string{},
+                "selectType":  "",
+                "buyer":       []string{companyName},
+        }
+
+        if _id := this.MgoJy.Save("export_search", saveMap); _id != "" </span><span class="cov0" title="0">{
+                return encrypt.SE.Encode2Hex(_id), nil
+        }</span>
+        <span class="cov0" title="0">return "", errors.New(entity.NO_DATA_ERROR_MSG)</span>
+}
+
+// @description          经销商画像基本信息
+// @param                     companyId 经销商id
+// @param                     user_id   base_user_id
+// @return                    distributorInfo 经销商画像信息
+// @return                    error 错误信息
+func (this *PortraitService) DistributorInfo(companyId string, user_id int64) (*entity.DistributorInfo, error) <span class="cov0" title="0">{
+        if companyId == "" || user_id == 0 </span><span class="cov0" title="0">{
+                return nil, errors.New(entity.NO_DATA_ERROR_MSG)
+        }</span>
+        //查找基本信息
+        <span class="cov0" title="0">rdata := this.GlobalCommonData.SelectBySql(fmt.Sprintf(`select company_name,company_code,cancel_date,company_phone,operation_startdate,operation_enddate,credit_no,real_capital,org_code,tax_code,establish_date,legal_person,company_type,employee_no,company_address,business_scope
+                                                                                                                        from %s where company_id =?`, entity.Company_baseinfo), companyId)
+        if rdata == nil || len(*rdata) == 0 </span><span class="cov0" title="0">{
+                return nil, errors.New(entity.NO_DATA_ERROR_MSG)
+        }</span>
+        <span class="cov0" title="0">data := (*rdata)[0]
+        distributorInfo := &amp;entity.DistributorInfo{
+                //TODO 还没判断是否关注
+                LegalPerson: ObjToString(data["legal_person"]), //法定代表人
+                //TODO 经营状态不知道咋看
+                // CompanyStatus       //经营状态
+                CreditNo:           ObjToString(data["credit_no"]),           //统一信用代码
+                EstablishDate:      ObjToString(data["establish_date"]),      //成立日期
+                OrgCode:            ObjToString(data["org_code"]),            //组织机构代码
+                Capital:            ObjToString(data["real_capital"]),        //注册资本
+                TaxCode:            ObjToString(data["tax_code"]),            //纳税人识别号
+                OperationStartdate: ObjToString(data["operation_startdate"]), //营业期限开始
+                OperationEnddate:   ObjToString(data["operation_enddate"]),   //营业期限至 结束
+                CompanyCode:        ObjToString(data["company_code"]),        //工商注册号
+                CompanyType:        ObjToString(data["company_type"]),        //公司类型
+                EmployeeNo:         ObjToString(data["employee_no"]),         //人员规模
+                CompanyPhone:       ObjToString(data["company_phone"]),       //联系方式
+                CompanyAddress:     ObjToString(data["business_scope"]),      //注册地址
+                BusinessScope:      ObjToString(data["cancel_date"]),         //经营范围
+                ConpanyName:        ObjToString(data["company_name"]),        //企业名称
+        }
+        return distributorInfo, nil</span>
+}
+
+// @description          经销商画像-医械产品
+// @param                     companyId 经销商id
+// @param                     user_id   base_user_id
+// @return                    distributorInfo 经销商画像信息
+// @return                    error 错误信息
+func (this *PortraitService) MedicalProdcutList(companyId string, user_id int64) (*[]entity.MedicalEquipment, error) <span class="cov0" title="0">{
+        if companyId == "" || user_id == 0 </span><span class="cov0" title="0">{
+                return nil, errors.New(entity.NO_DATA_ERROR_MSG)
+        }</span>
+        //查找基本信息
+        <span class="cov0" title="0">rdata := this.GlobalCommonData.SelectBySql(fmt.Sprintf(`SELECT product_name,regno,approve_date,validity_date,manage_type,regist_type
+                                                                                                                        from %s where company_id =? order by id desc`, entity.Product_baseinfo), companyId)
+        if rdata == nil || len(*rdata) == 0 </span><span class="cov0" title="0">{
+                return nil, errors.New(entity.NO_DATA_ERROR_MSG)
+        }</span>
+        <span class="cov0" title="0">list := &amp;[]entity.MedicalEquipment{}
+        for _, v := range *rdata </span><span class="cov0" title="0">{
+                *list = append(*list, entity.MedicalEquipment{
+                        ProductName:  ObjToString(v["product_name"]),  //产品名称
+                        Regno:        ObjToString(v["regno"]),         //注册/备案证编号
+                        ApproveDate:  ObjToString(v["approve_date"]),  //批准日期|备案日期
+                        ValidityDate: ObjToString(v["validity_date"]), //有效期至
+                        ManageType:   ObjToString(v["manage_type"]),   //管理类别
+                        RegistType:   Int64All(v["regist_type"]),      //1-注册产品 2-备案产品
+                })
+        }</span>
+        <span class="cov0" title="0">return list, nil</span>
+}
+</pre>
+		
+		</div>
+	</body>
+	<script>
+	(function() {
+		var files = document.getElementById('files');
+		var visible;
+		files.addEventListener('change', onChange, false);
+		function select(part) {
+			if (visible)
+				visible.style.display = 'none';
+			visible = document.getElementById(part);
+			if (!visible)
+				return;
+			files.value = part;
+			visible.style.display = 'block';
+			location.hash = part;
+		}
+		function onChange() {
+			select(files.value);
+			window.scrollTo(0, 0);
+		}
+		if (location.hash != "") {
+			select(location.hash.substr(1));
+		}
+		if (!visible) {
+			select("file0");
+		}
+	})();
+	</script>
+</html>

+ 15 - 0
go.mod

@@ -6,8 +6,23 @@ require (
 	app.yhyue.com/moapp/jybase v0.0.0-20220802080941-07f401baab8b
 	app.yhyue.com/moapp/jybase v0.0.0-20220802080941-07f401baab8b
 	bp.jydev.jianyu360.cn/BaseService/gateway v1.3.4
 	bp.jydev.jianyu360.cn/BaseService/gateway v1.3.4
 	bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.2
 	bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.2
+	github.com/AlecAivazis/survey/v2 v2.3.5 // indirect
+	github.com/andygrunwald/go-jira v1.16.0 // indirect
+	github.com/git-chglog/git-chglog v0.15.1 // indirect
 	github.com/go-sql-driver/mysql v1.6.0
 	github.com/go-sql-driver/mysql v1.6.0
+	github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
+	github.com/huandu/xstrings v1.3.2 // indirect
+	github.com/imdario/mergo v0.3.13 // indirect
+	github.com/kyokomi/emoji/v2 v2.2.10 // indirect
+	github.com/mattn/go-colorable v0.1.13 // indirect
+	github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect
+	github.com/mitchellh/copystructure v1.2.0 // indirect
+	github.com/spf13/cast v1.5.0 // indirect
+	github.com/urfave/cli/v2 v2.11.2 // indirect
 	github.com/zeromicro/go-zero v1.4.0
 	github.com/zeromicro/go-zero v1.4.0
+	golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 // indirect
+	golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 // indirect
+	golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 // indirect
 	google.golang.org/grpc v1.48.0
 	google.golang.org/grpc v1.48.0
 	google.golang.org/protobuf v1.28.1
 	google.golang.org/protobuf v1.28.1
 )
 )

+ 94 - 0
go.sum

@@ -51,6 +51,9 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl
 cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
 cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
 cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
 cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+github.com/AlecAivazis/survey/v2 v2.3.2/go.mod h1:TH2kPCDU3Kqq7pLbnCWwZXDBjnhZtmsCle5EiYDJ2fg=
+github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5E/9wRQ=
+github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI=
 github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
 github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
 github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw=
 github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw=
 github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA=
 github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA=
@@ -66,12 +69,21 @@ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBp
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw=
 github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw=
 github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
 github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/ClickHouse/clickhouse-go v1.5.1/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI=
 github.com/ClickHouse/clickhouse-go v1.5.1/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI=
 github.com/ClickHouse/clickhouse-go v1.5.4/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI=
 github.com/ClickHouse/clickhouse-go v1.5.4/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI=
 github.com/ClickHouse/clickhouse-go/v2 v2.2.0/go.mod h1:8f2XZUi7XoeU+uPIytSi1cvx8fmJxi7vIgqpvYTF1+o=
 github.com/ClickHouse/clickhouse-go/v2 v2.2.0/go.mod h1:8f2XZUi7XoeU+uPIytSi1cvx8fmJxi7vIgqpvYTF1+o=
 github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
 github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
+github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
+github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
+github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc=
+github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
+github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8=
+github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk=
 github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
 github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
+github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc=
+github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w=
 github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
 github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
 github.com/Shopify/sarama v1.30.0/go.mod h1:zujlQQx1kzHsh4jfV1USnptCQrHAEZ2Hk8fTKCulPVs=
 github.com/Shopify/sarama v1.30.0/go.mod h1:zujlQQx1kzHsh4jfV1USnptCQrHAEZ2Hk8fTKCulPVs=
@@ -87,6 +99,9 @@ github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGn
 github.com/alicebob/miniredis/v2 v2.17.0/go.mod h1:gquAfGbzn92jvtrSC69+6zZnwSODVXVpYDRaGhWaL6I=
 github.com/alicebob/miniredis/v2 v2.17.0/go.mod h1:gquAfGbzn92jvtrSC69+6zZnwSODVXVpYDRaGhWaL6I=
 github.com/alicebob/miniredis/v2 v2.22.0 h1:lIHHiSkEyS1MkKHCHzN+0mWrA4YdbGdimE5iZ2sHSzo=
 github.com/alicebob/miniredis/v2 v2.22.0 h1:lIHHiSkEyS1MkKHCHzN+0mWrA4YdbGdimE5iZ2sHSzo=
 github.com/alicebob/miniredis/v2 v2.22.0/go.mod h1:XNqvJdQJv5mSuVMc0ynneafpnL/zv52acZ6kqeS0t88=
 github.com/alicebob/miniredis/v2 v2.22.0/go.mod h1:XNqvJdQJv5mSuVMc0ynneafpnL/zv52acZ6kqeS0t88=
+github.com/andygrunwald/go-jira v1.14.0/go.mod h1:KMo2f4DgMZA1C9FdImuLc04x4WQhn5derQpnsuBFgqE=
+github.com/andygrunwald/go-jira v1.16.0 h1:PU7C7Fkk5L96JvPc6vDVIrd99vdPnYudHu4ju2c2ikQ=
+github.com/andygrunwald/go-jira v1.16.0/go.mod h1:UQH4IBVxIYWbgagc0LF/k9FRs9xjIiQ8hIcC6HfLwFU=
 github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
 github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
 github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48=
 github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48=
@@ -122,7 +137,10 @@ github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzA
 github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
 github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
 github.com/coscms/tagfast v0.0.0-20150925144250-2b69b2496250/go.mod h1:zX8vynptAghuV/KG8BOZlDeo4DsTKWfBQ154RWlkay0=
 github.com/coscms/tagfast v0.0.0-20150925144250-2b69b2496250/go.mod h1:zX8vynptAghuV/KG8BOZlDeo4DsTKWfBQ154RWlkay0=
 github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
+github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
 github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -153,10 +171,13 @@ github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQL
 github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
 github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
 github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
 github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
 github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
 github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
+github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
+github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
 github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
 github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
 github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
 github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
 github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
 github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
 github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
 github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
+github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI=
 github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI=
@@ -165,6 +186,8 @@ github.com/fullstorydev/grpcurl v1.8.6/go.mod h1:WhP7fRQdhxz2TkL97u+TCb505sxfH78
 github.com/garyburd/redigo v1.6.2/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
 github.com/garyburd/redigo v1.6.2/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
 github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/git-chglog/git-chglog v0.15.1 h1:s4FqW1jQ8ZVb3M6p9uMZDvspm4zkatVJcyG0p/Q4h7U=
+github.com/git-chglog/git-chglog v0.15.1/go.mod h1:ODSB06FDj/KND1ul+aBOqETRy5tvs+Kk4YdDmD7soeU=
 github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
 github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
@@ -235,6 +258,9 @@ github.com/gogf/gf/v2 v2.0.6/go.mod h1:8uYzw7qNzuq8vrhVlWke1b1925FFqOJIgmyYW1sr/
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
+github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
+github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
 github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
 github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
 github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs=
 github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs=
 github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
 github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
@@ -289,6 +315,9 @@ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
 github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
 github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
 github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
 github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
+github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
+github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
 github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
@@ -333,11 +362,20 @@ github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplb
 github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
 github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
 github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A=
+github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68=
 github.com/howeyc/fsnotify v0.9.0/go.mod h1:41HzSPxBGeFRQKEEwgh49TRw/nKBsYZ2cF1OzPjSJsA=
 github.com/howeyc/fsnotify v0.9.0/go.mod h1:41HzSPxBGeFRQKEEwgh49TRw/nKBsYZ2cF1OzPjSJsA=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
+github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw=
+github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
+github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
+github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
+github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk=
+github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs=
 github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs=
 github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM=
 github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM=
@@ -375,6 +413,8 @@ github.com/justinas/alice v1.2.0 h1:+MHSA/vccVCF4Uq37S42jwlkvI2Xzl7zTPCN5BnZNVo=
 github.com/justinas/alice v1.2.0/go.mod h1:fN5HRH/reO/zrUflLfTN43t3vXvKzvZIENsNEe7i7qA=
 github.com/justinas/alice v1.2.0/go.mod h1:fN5HRH/reO/zrUflLfTN43t3vXvKzvZIENsNEe7i7qA=
 github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
 github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
 github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
 github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
+github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
+github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
 github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
@@ -388,11 +428,16 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN
 github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
 github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
 github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
 github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/kyokomi/emoji/v2 v2.2.8/go.mod h1:JUcn42DTdsXJo1SWanHh4HKDEyPaR5CqkmoirZZP9qE=
+github.com/kyokomi/emoji/v2 v2.2.10 h1:1z5eMVcxFifsmEoNpdeq4UahbcicgQ4FEHuzrCVwmiI=
+github.com/kyokomi/emoji/v2 v2.2.10/go.mod h1:JUcn42DTdsXJo1SWanHh4HKDEyPaR5CqkmoirZZP9qE=
 github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
 github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
 github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
@@ -405,12 +450,19 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0
 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
 github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
 github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=
 github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=
+github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U=
 github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U=
 github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
+github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
+github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
+github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
 github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
 github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
 github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
 github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
 github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
 github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
+github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
+github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
 github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
 github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
 github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
 github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
@@ -418,7 +470,16 @@ github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOq
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
 github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
 github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
 github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
+github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
+github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI=
+github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
+github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
+github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
+github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
 github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
+github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
+github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
 github.com/mkevac/debugcharts v0.0.0-20191222103121-ae1c48aa8615/go.mod h1:Ad7oeElCZqA1Ufj0U9/liOF4BtVepxRcTvr2ey7zTvM=
 github.com/mkevac/debugcharts v0.0.0-20191222103121-ae1c48aa8615/go.mod h1:Ad7oeElCZqA1Ufj0U9/liOF4BtVepxRcTvr2ey7zTvM=
 github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=
 github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -517,11 +578,17 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L
 github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
+github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 github.com/shirou/gopsutil v2.19.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
 github.com/shirou/gopsutil v2.19.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
 github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
 github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
 github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
 github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
+github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
+github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
 github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
 github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
+github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
 github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
 github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
 github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
@@ -535,6 +602,9 @@ github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+z
 github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
 github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
 github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
 github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
+github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
+github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU=
 github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
@@ -546,6 +616,7 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
 github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4=
 github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4=
 github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
 github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
@@ -561,7 +632,13 @@ github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
 github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
 github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
 github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk=
 github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk=
 github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ=
 github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ=
+github.com/trivago/tgo v1.0.7 h1:uaWH/XIy9aWYWpjm2CU3RpcqZXmX2ysQ9/Go+d9gyrM=
+github.com/trivago/tgo v1.0.7/go.mod h1:w4dpD+3tzNIIiIfkWWa85w5/B77tlvdZckQ+6PkFnhc=
+github.com/tsuyoshiwada/go-gitcmd v0.0.0-20180205145712-5f1f5f9475df h1:Y2l28Jr3vOEeYtxfVbMtVfOdAwuUqWaP9fvNKiBVeXY=
+github.com/tsuyoshiwada/go-gitcmd v0.0.0-20180205145712-5f1f5f9475df/go.mod h1:pnyouUty/nBr/zm3GYwTIt+qFTLWbdjeLjZmJdzJOu8=
 github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
 github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
+github.com/urfave/cli/v2 v2.11.2 h1:FVfNg4m3vbjbBpLYxW//WjxUoHvJ9TlppXcqY9Q9ZfA=
+github.com/urfave/cli/v2 v2.11.2/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo=
 github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
 github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
 github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
 github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
 github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
 github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
@@ -572,6 +649,8 @@ github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCO
 github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
 github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
 github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
 github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
 github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
 github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
+github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
+github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
 github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
 github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
 github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
 github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
 github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -652,10 +731,12 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
 golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
 golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -664,6 +745,8 @@ golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWP
 golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY=
 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY=
 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM=
+golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -767,6 +850,7 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h
 golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -822,18 +906,27 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220429233432-b5fbb4746d32/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220429233432-b5fbb4746d32/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 h1:v6hYoSR9T5oet+pMXwUWkbiVqx/63mlHjefrHmxwfeY=
+golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 h1:Q5284mrmYTpACcm+eAKjKJH48BBwSyfJqmmGDTtT8Vc=
+golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1038,6 +1131,7 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gorm.io/driver/mysql v1.0.5 h1:WAAmvLK2rG0tCOqrf5XcLi2QUwugd4rcVJ/W3aoon9o=
 gorm.io/driver/mysql v1.0.5 h1:WAAmvLK2rG0tCOqrf5XcLi2QUwugd4rcVJ/W3aoon9o=

+ 1 - 1
rpc/medical/internal/svc/servicecontext.go

@@ -8,7 +8,7 @@ import (
 
 
 type ServiceContext struct {
 type ServiceContext struct {
 	Config      config.Config
 	Config      config.Config
-	EntClaimSrv *service.EntClaimService
+	EntClaimSrv service.EntClaimService
 }
 }
 
 
 func NewServiceContext(c config.Config) *ServiceContext {
 func NewServiceContext(c config.Config) *ServiceContext {

+ 3 - 0
script/restart_api.sh

@@ -0,0 +1,3 @@
+ps -ef | grep medical_api_linux | grep -v grep | awk '{print "kill -9 " $2}' |sh
+nohup ./medical_api_linux &
+

+ 3 - 0
script/restart_rpc.sh

@@ -0,0 +1,3 @@
+ps -ef | grep medical_rpc_linux | grep -v grep | awk '{print "kill -9 " $2}' |sh
+nohup ./medical_rpc_linux &
+

+ 3 - 2
service/InstitutionService_test.go

@@ -18,7 +18,7 @@ var institutionService InstitutionService
 var authService AuthService
 var authService AuthService
 var PortService PortraitService
 var PortService PortraitService
 
 
-func init() {
+func InitDb() *entity.Conn {
 	//医疗机构配置
 	//医疗机构配置
 	MysqlConn := &mysql.Mysql{
 	MysqlConn := &mysql.Mysql{
 		Address:      "192.168.3.217:4000",
 		Address:      "192.168.3.217:4000",
@@ -83,8 +83,9 @@ func init() {
 		GlobalCommonData: CommonMysqlConn,
 		GlobalCommonData: CommonMysqlConn,
 		MgoJy:            MgoJy,
 		MgoJy:            MgoJy,
 	}
 	}
-	EntClaimSrv = *NewEntClaimSrv(&MyConn)
+	EntClaimSrv = NewEntClaimSrv(&MyConn)
 	PortService = *NewPortrait(&MyConn)
 	PortService = *NewPortrait(&MyConn)
+	return &MyConn
 }
 }
 func TestInstitutionService_GetFilterItem(t *testing.T) {
 func TestInstitutionService_GetFilterItem(t *testing.T) {
 	tests := []struct {
 	tests := []struct {

+ 22 - 11
service/claim.go

@@ -9,20 +9,31 @@ import (
 	"strings"
 	"strings"
 )
 )
 
 
+// EntClaimService 接口定义
+type EntClaimService interface {
+	Claim(data *entity.EntClaim) (int64, error)                                                        // 认领
+	UnclaimedByEnt(userId int, entId string, type_ int) (bool, int)                                    // 取消认领
+	IsClaimed(userId int, appId string, entId string, typeCode int) bool                               // 是否认领
+	DistributorList(userId int, appId string, page int, pageSize int) (*[]map[string]interface{}, int) // 认领的经销商列表
+	InstitutionList(userId int, appId string, page int, pageSize int) (*[]map[string]interface{}, int) // 认领的医疗机构列表
+	GetCompanyByIds(ids []string) *[]map[string]interface{}                                            // 获取经销商详细信息
+	GetInstitutionByIds(ids []string) *[]map[string]interface{}                                        // 获取医疗机构详细信息
+}
+
 // EntClaimService 企业认领
 // EntClaimService 企业认领
-type EntClaimService struct {
+type entClaimService struct {
 	*entity.Conn
 	*entity.Conn
 }
 }
 
 
-// NewEntClaimSrv 创建一个EntClaimSrv实例
-func NewEntClaimSrv(conn *entity.Conn) *EntClaimService {
-	return &EntClaimService{
+// NewEntClaimSrv 创建一个实例
+func NewEntClaimSrv(conn *entity.Conn) EntClaimService {
+	return &entClaimService{
 		conn,
 		conn,
 	}
 	}
 }
 }
 
 
 // Claim 认领
 // Claim 认领
-func (e *EntClaimService) Claim(data *entity.EntClaim) (int64, error) {
+func (e *entClaimService) Claim(data *entity.EntClaim) (int64, error) {
 	if e.IsClaimed(data.UserId, data.AppId, data.EntId, data.Type) {
 	if e.IsClaimed(data.UserId, data.AppId, data.EntId, data.Type) {
 		return 0, entity.RepeatErr
 		return 0, entity.RepeatErr
 	}
 	}
@@ -30,7 +41,7 @@ func (e *EntClaimService) Claim(data *entity.EntClaim) (int64, error) {
 }
 }
 
 
 // UnclaimedByEnt 根据企业id取消认领
 // UnclaimedByEnt 根据企业id取消认领
-func (e EntClaimService) UnclaimedByEnt(userId int, entId string, type_ int) (bool, int) {
+func (e *entClaimService) UnclaimedByEnt(userId int, entId string, type_ int) (bool, int) {
 
 
 	query := map[string]interface{}{
 	query := map[string]interface{}{
 		"user_id": userId,
 		"user_id": userId,
@@ -56,7 +67,7 @@ func (e EntClaimService) UnclaimedByEnt(userId int, entId string, type_ int) (bo
 }
 }
 
 
 // IsClaimed 是否认领
 // IsClaimed 是否认领
-func (e *EntClaimService) IsClaimed(userId int, appId string, entId string, typeCode int) bool {
+func (e *entClaimService) IsClaimed(userId int, appId string, entId string, typeCode int) bool {
 	query := map[string]interface{}{
 	query := map[string]interface{}{
 		"appId":   appId,
 		"appId":   appId,
 		"user_id": userId,
 		"user_id": userId,
@@ -68,7 +79,7 @@ func (e *EntClaimService) IsClaimed(userId int, appId string, entId string, type
 }
 }
 
 
 // DistributorList 关注的经销商列表
 // DistributorList 关注的经销商列表
-func (e *EntClaimService) DistributorList(userId int, appId string, page int, pageSize int) (*[]map[string]interface{}, int) {
+func (e *entClaimService) DistributorList(userId int, appId string, page int, pageSize int) (*[]map[string]interface{}, int) {
 
 
 	query := map[string]interface{}{
 	query := map[string]interface{}{
 		"user_id": userId,
 		"user_id": userId,
@@ -86,7 +97,7 @@ func (e *EntClaimService) DistributorList(userId int, appId string, page int, pa
 }
 }
 
 
 // InstitutionList  我关注的医疗机构列表
 // InstitutionList  我关注的医疗机构列表
-func (e *EntClaimService) InstitutionList(userId int, appId string, page int, pageSize int) (*[]map[string]interface{}, int) {
+func (e *entClaimService) InstitutionList(userId int, appId string, page int, pageSize int) (*[]map[string]interface{}, int) {
 	query := map[string]interface{}{
 	query := map[string]interface{}{
 		"user_id": userId,
 		"user_id": userId,
 		"appid":   appId,
 		"appid":   appId,
@@ -103,7 +114,7 @@ func (e *EntClaimService) InstitutionList(userId int, appId string, page int, pa
 }
 }
 
 
 // GetCompanyByIds   批量获取经销商详细信息
 // GetCompanyByIds   批量获取经销商详细信息
-func (e EntClaimService) GetCompanyByIds(ids []string) *[]map[string]interface{} {
+func (e *entClaimService) GetCompanyByIds(ids []string) *[]map[string]interface{} {
 	if len(ids) == 0 {
 	if len(ids) == 0 {
 		return &[]map[string]interface{}{}
 		return &[]map[string]interface{}{}
 	}
 	}
@@ -113,7 +124,7 @@ func (e EntClaimService) GetCompanyByIds(ids []string) *[]map[string]interface{}
 }
 }
 
 
 // GetInstitutionByIds  批量获取机构详细信息
 // GetInstitutionByIds  批量获取机构详细信息
-func (e EntClaimService) GetInstitutionByIds(ids []string) *[]map[string]interface{} {
+func (e *entClaimService) GetInstitutionByIds(ids []string) *[]map[string]interface{} {
 	if len(ids) == 0 {
 	if len(ids) == 0 {
 		return &[]map[string]interface{}{}
 		return &[]map[string]interface{}{}
 	}
 	}

+ 10 - 9
service/claim_test.go

@@ -26,7 +26,7 @@ func TestEntClaimService_Claim(t *testing.T) {
 		}, true, false,
 		}, true, false,
 		},
 		},
 		{"认领医疗机构-重复认领", args{
 		{"认领医疗机构-重复认领", args{
-			data: &entity.EntClaim{UserId: -1, AppId: "10000", EntId: "25caa43ce64036dfd1f55635e06394a6", EntName: "汉川市人民医院", Status: entity.StatusClaimed, Type: entity.TypeInstitution, CreateTime: time.Now().Format("2006-01-02 15:04:05")},
+			data: &entity.EntClaim{UserId: -1, AppId: "10000", EntId: "5a8f3bde5e75b16a98715041ba687705", EntName: "汉川市人民医院", Status: entity.StatusClaimed, Type: entity.TypeInstitution, CreateTime: time.Now().Format("2006-01-02 15:04:05")},
 		}, false, true,
 		}, false, true,
 		},
 		},
 		{"认领经销商-新增 ", args{
 		{"认领经销商-新增 ", args{
@@ -34,7 +34,7 @@ func TestEntClaimService_Claim(t *testing.T) {
 		}, true, false,
 		}, true, false,
 		},
 		},
 		{"认领经销商-重复认领", args{
 		{"认领经销商-重复认领", args{
-			data: &entity.EntClaim{UserId: -1, AppId: "10000", EntId: "d8f48ada3c357d0812df188cc14ed527", EntName: "邢台太行医用材料有限公司", Status: entity.StatusClaimed, Type: entity.TypeDistributor, CreateTime: time.Now().Format("2006-01-02 15:04:05")},
+			data: &entity.EntClaim{UserId: -1, AppId: "10000", EntId: "b4eb554e9e7368c17761d4f722e7cf5e", EntName: "邢台太行医用材料有限公司", Status: entity.StatusClaimed, Type: entity.TypeDistributor, CreateTime: time.Now().Format("2006-01-02 15:04:05")},
 		}, false, true,
 		}, false, true,
 		},
 		},
 	}
 	}
@@ -248,10 +248,10 @@ func TestEntClaimService_UnclaimedByEnt(t *testing.T) {
 }
 }
 
 
 // 数据准备
 // 数据准备
-func setupClaim() {
+func setupClaim(conn *entity.Conn) {
 	fmt.Println("setup ...")
 	fmt.Println("setup ...")
 	// 删除测试用例产生的数据
 	// 删除测试用例产生的数据
-	EntClaimSrv.BaseMysql.Delete(entity.TableDomainEntClaim, map[string]interface{}{
+	conn.BaseMysql.Delete(entity.TableDomainEntClaim, map[string]interface{}{
 		"user_id": "-1",
 		"user_id": "-1",
 	})
 	})
 	fmt.Println("clean over...")
 	fmt.Println("clean over...")
@@ -281,15 +281,15 @@ func setupClaim() {
 		"10000", -1, "be23b68d98c14847d341f84f6c5da4f3", "洪泽县晨光医疗器械有限公司", entity.StatusClaimed, entity.TypeDistributor, time.Now().Format("2006-01-02 15:04:05"),
 		"10000", -1, "be23b68d98c14847d341f84f6c5da4f3", "洪泽县晨光医疗器械有限公司", entity.StatusClaimed, entity.TypeDistributor, time.Now().Format("2006-01-02 15:04:05"),
 		"10000", -1, "b4eb554e9e7368c17761d4f722e7cf5e", "深圳市华晨阳科技有限公司", entity.StatusClaimed, entity.TypeDistributor, time.Now().Format("2006-01-02 15:04:05"),
 		"10000", -1, "b4eb554e9e7368c17761d4f722e7cf5e", "深圳市华晨阳科技有限公司", entity.StatusClaimed, entity.TypeDistributor, time.Now().Format("2006-01-02 15:04:05"),
 	}
 	}
-	EntClaimSrv.BaseMysql.InsertBatch(entity.TableDomainEntClaim, field, values)
+	conn.BaseMysql.InsertBatch(entity.TableDomainEntClaim, field, values)
 	fmt.Println("setup ok...")
 	fmt.Println("setup ok...")
 }
 }
 
 
 // 清理产生的测试数据
 // 清理产生的测试数据
-func teardownClaim() {
+func teardownClaim(conn *entity.Conn) {
 	fmt.Println("teardown...")
 	fmt.Println("teardown...")
 	// 删除测试用例产生的数据
 	// 删除测试用例产生的数据
-	EntClaimSrv.BaseMysql.Delete(entity.TableDomainEntClaim, map[string]interface{}{
+	conn.BaseMysql.Delete(entity.TableDomainEntClaim, map[string]interface{}{
 		"user_id": "-1",
 		"user_id": "-1",
 	})
 	})
 	fmt.Println("teardown  ok...")
 	fmt.Println("teardown  ok...")
@@ -298,9 +298,10 @@ func teardownClaim() {
 // 通过testMain 来执行测试用例  可以做全局的准备和清理工作
 // 通过testMain 来执行测试用例  可以做全局的准备和清理工作
 func TestMain(m *testing.M) {
 func TestMain(m *testing.M) {
 	// setup code...
 	// setup code...
-	setupClaim()
+	conn := InitDb() // 显式初始化数据库
+	setupClaim(conn)
 	fmt.Println("start init")
 	fmt.Println("start init")
 	code := m.Run()
 	code := m.Run()
-	teardownClaim()
+	teardownClaim(conn)
 	os.Exit(code)
 	os.Exit(code)
 }
 }

+ 4 - 4
service/test_cover.out

@@ -92,10 +92,10 @@ bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.
 bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.go:253.36,255.4 1 0
 bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.go:253.36,255.4 1 0
 bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.go:256.8,258.3 1 1
 bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.go:256.8,258.3 1 1
 bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.go:269.122,277.46 3 4
 bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.go:269.122,277.46 3 4
-bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.go:280.2,280.31 1 1
-bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.go:283.2,283.21 1 1
-bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.go:277.46,279.3 1 3
-bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.go:280.31,282.3 1 1
+bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.go:280.2,280.31 1 4
+bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.go:283.2,283.21 1 4
+bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.go:277.46,279.3 1 0
+bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.go:280.31,282.3 1 4
 bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.go:287.152,289.28 2 2
 bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.go:287.152,289.28 2 2
 bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.go:318.2,318.24 1 2
 bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.go:318.2,318.24 1 2
 bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.go:289.28,293.35 3 2
 bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.go:289.28,293.35 3 2

+ 23 - 9
test/api_test.http

@@ -1,8 +1,8 @@
 ### 机构认领
 ### 机构认领
-POST http://{{host}}/domain/institution/claim
+POST http://{{host}}:{{port}}/domain/institution/claim
 Content-Type: application/json
 Content-Type: application/json
 Cookie: SESSIONID=8699c0583e3caa719ac2da5a85c560852ff7da33
 Cookie: SESSIONID=8699c0583e3caa719ac2da5a85c560852ff7da33
-newUserId:2022
+newUserId:22
 appId:10000
 appId:10000
 
 
 {
 {
@@ -16,7 +16,7 @@ client.test("Request executed successfully", function() {
 });
 });
 %}
 %}
 ### 经销商认领
 ### 经销商认领
-POST http://{{host}}/domain/distributor/claim
+POST http://{{host}}:{{port}}/domain/distributor/claim
 Content-Type: application/json
 Content-Type: application/json
 Cookie: SESSIONID=8699c0583e3caa719ac2da5a85c560852ff7da33
 Cookie: SESSIONID=8699c0583e3caa719ac2da5a85c560852ff7da33
 newUserId:2022
 newUserId:2022
@@ -33,7 +33,7 @@ client.test("Request executed successfully", function() {
 });
 });
 %}
 %}
 ### 机构取消认领
 ### 机构取消认领
-POST http://{{host}}/domain/institution/unclaimed
+POST http://{{host}}:{{port}}/domain/institution/unclaimed
 Content-Type: application/json
 Content-Type: application/json
 Cookie:
 Cookie:
 newUserId:2022
 newUserId:2022
@@ -48,7 +48,7 @@ client.test("Request executed successfully", function() {
 });
 });
 %}
 %}
 ### 经销商取消认领
 ### 经销商取消认领
-POST http://{{host}}/domain/distributor/unclaimed
+POST http://{{host}}:{{port}}/domain/distributor/unclaimed
 Content-Type: application/json
 Content-Type: application/json
 Cookie:
 Cookie:
 newUserId:2022
 newUserId:2022
@@ -64,14 +64,14 @@ client.test("Request executed successfully", function() {
 %}
 %}
 
 
 ### 是否认领过
 ### 是否认领过
-POST http://{{host}}/domain/isClaimed
+POST http://{{host}}:{{port}}/domain/isClaimed
 Content-Type: application/json
 Content-Type: application/json
 #Cookie:
 #Cookie:
 newUserId:22
 newUserId:22
 appId:10000
 appId:10000
 
 
 {
 {
-  "company_id": "1057165a5d1556510256475a470a554c030255534557480d0645065555004658",
+  "company_id": "F1tGCFAQAQIFDEMKRA8ETQAJCVESWRJYBxdXVVcEEV0",
   "type": 1
   "type": 1
 }
 }
 > {%
 > {%
@@ -82,7 +82,7 @@ client.test("Request executed successfully", function() {
 
 
 
 
 ### 我认领的经销商
 ### 我认领的经销商
-POST http://{{host}}/domain/claim/distributor
+POST http://{{host}}:{{port}}/domain/claim/distributor
 Content-Type: application/json
 Content-Type: application/json
 Cookie: SESSIONID=16240cfcc75bc0fb879bc9ea90e44d06c158b7d8
 Cookie: SESSIONID=16240cfcc75bc0fb879bc9ea90e44d06c158b7d8
 newUserId:22
 newUserId:22
@@ -97,7 +97,7 @@ client.test("Request executed successfully", function() {
 
 
 
 
 ### 我认领的医疗机构
 ### 我认领的医疗机构
-POST http://{{host}}/domain/claim/institution
+POST http://{{host}}:{{port}}/domain/claim/institution
 Content-Type: application/json
 Content-Type: application/json
 #Cookie:
 #Cookie:
 newUserId:22
 newUserId:22
@@ -110,3 +110,17 @@ client.test("Request executed successfully", function() {
 });
 });
 %}
 %}
 
 
+
+###
+POST http://{{host}}:{{port}}/domain/search/distributor
+Content-Type: application/json
+#Cookie:
+newUserId:72896
+appId:10000
+resourceUseCount:100
+
+> {%
+client.test("Request executed successfully", function() {
+  client.assert(response.status === 200, "Response status is not 200");
+});
+%}

+ 9 - 3
test/http-client.env.json

@@ -1,10 +1,16 @@
 {
 {
   "dev": {
   "dev": {
-    "host": "192.168.150.47:8881"
+    "host": "127.0.0.1",
+    "port": "8881",
+    "rpcPort": "8080"
   },
   },
   "proxy240": {
   "proxy240": {
-    "host": "192.168.3.240:8077"
+    "host": "192.168.3.240",
+    "port": "8077"
   },
   },
   "dev240": {
   "dev240": {
-    "host": "192.168.3.240:8881"
+    "host": "192.168.3.240",
+    "port": "8881",
+    "rpcPort": "8082"
+
   }}
   }}

+ 7 - 7
test/rpc_test.http

@@ -1,5 +1,5 @@
 ### 我认领的经销商列表
 ### 我认领的经销商列表
-GRPC {{host}}:8080/medical.Medical/ClaimedDistributorList
+GRPC {{host}}:{{rpcPort}}/medical.Medical/ClaimedDistributorList
 
 
 {
 {
   "AppId": "10000",
   "AppId": "10000",
@@ -9,26 +9,26 @@ GRPC {{host}}:8080/medical.Medical/ClaimedDistributorList
 }
 }
 
 
 ### 我认领的医疗机构列表
 ### 我认领的医疗机构列表
-GRPC {{host}}:8080/medical.Medical/ClaimedInstitutionList
+GRPC {{host}}:{{rpcPort}}/medical.Medical/ClaimedInstitutionList
 
 
 {
 {
   "AppId": "10000",
   "AppId": "10000",
-  "UserId": 68819,
+  "UserId": 22,
   "Page": 0,
   "Page": 0,
   "PageSize": 10
   "PageSize": 10
 }
 }
 
 
 ### 认领
 ### 认领
-GRPC {{host}}:8080/medical.Medical/Claim
+GRPC {{host}}:{{rpcPort}}/medical.Medical/Claim
 
 
 {
 {
   "AppId": "10000",
   "AppId": "10000",
-  "UserId": 68819,
+  "UserId": 22,
   "EntId": "30d041422855fda867a356b3994a67ea",
   "EntId": "30d041422855fda867a356b3994a67ea",
   "Type": 2
   "Type": 2
 }
 }
 ### 取消认领
 ### 取消认领
-GRPC {{host}}:8080/medical.Medical/UnClaimed
+GRPC {{host}}:{{rpcPort}}/medical.Medical/UnClaimed
 
 
 {
 {
   "UserId": 22,
   "UserId": 22,
@@ -36,7 +36,7 @@ GRPC {{host}}:8080/medical.Medical/UnClaimed
   "AppId": "10000"
   "AppId": "10000"
 }
 }
 ### 是否认领
 ### 是否认领
-GRPC {{host}}:8080/medical.Medical/IsClaimed
+GRPC {{host}}:{{rpcPort}}/medical.Medical/IsClaimed
 
 
 {
 {
   "AppId": "10000",
   "AppId": "10000",