正在显示
18 个修改的文件
包含
585 行增加
和
39 行删除
| @@ -207,7 +207,7 @@ func (this *ChanceController) Templates() { | @@ -207,7 +207,7 @@ func (this *ChanceController) Templates() { | ||
| 207 | } | 207 | } |
| 208 | 208 | ||
| 209 | //ChanceSubmit | 209 | //ChanceSubmit |
| 210 | -//@router /chanceSubmit [post] | 210 | +//@router /submit [post] |
| 211 | func (this *ChanceController) ChanceSubmit() { | 211 | func (this *ChanceController) ChanceSubmit() { |
| 212 | var msg *protocol.ResponseMessage | 212 | var msg *protocol.ResponseMessage |
| 213 | defer func() { | 213 | defer func() { |
| @@ -224,5 +224,9 @@ func (this *ChanceController) ChanceSubmit() { | @@ -224,5 +224,9 @@ func (this *ChanceController) ChanceSubmit() { | ||
| 224 | return | 224 | return |
| 225 | } | 225 | } |
| 226 | header := controllers.GetRequestHeader(this.Ctx) | 226 | header := controllers.GetRequestHeader(this.Ctx) |
| 227 | + if request.Id>0{ | ||
| 228 | + msg = protocol.NewReturnResponse(chance.ChanceUpdate(header, request)) | ||
| 229 | + return | ||
| 230 | + } | ||
| 227 | msg = protocol.NewReturnResponse(chance.ChanceSubmit(header, request)) | 231 | msg = protocol.NewReturnResponse(chance.ChanceSubmit(header, request)) |
| 228 | } | 232 | } |
| @@ -34,6 +34,8 @@ func SetStructValueByType(s interface{}, columnType string, columnValue interfac | @@ -34,6 +34,8 @@ func SetStructValueByType(s interface{}, columnType string, columnValue interfac | ||
| 34 | setValue.SetFloat(float64(columnValueV.Float())) | 34 | setValue.SetFloat(float64(columnValueV.Float())) |
| 35 | case reflect.String: | 35 | case reflect.String: |
| 36 | setValue.SetString(columnValueV.String()) | 36 | setValue.SetString(columnValueV.String()) |
| 37 | + case reflect.Struct: | ||
| 38 | + setValue.Set(columnValueV) | ||
| 37 | default: | 39 | default: |
| 38 | return errors.New("columnValue err for:" + columnType) | 40 | return errors.New("columnValue err for:" + columnType) |
| 39 | } | 41 | } |
| @@ -30,8 +30,8 @@ func init() { | @@ -30,8 +30,8 @@ func init() { | ||
| 30 | //}) | 30 | //}) |
| 31 | err := redis.InitWithDb(100, beego.AppConfig.String("redis_add_port"), beego.AppConfig.String("redis_auth"), "0") | 31 | err := redis.InitWithDb(100, beego.AppConfig.String("redis_add_port"), beego.AppConfig.String("redis_auth"), "0") |
| 32 | if err != nil { | 32 | if err != nil { |
| 33 | - log.Fatal(err, beego.AppConfig.String("redis_add_port"), beego.AppConfig.String("redis_auth")) | ||
| 34 | - //panic(err) | 33 | + log.Fatal("connect to redis error address:",beego.AppConfig.String("redis_add_port"), beego.AppConfig.String("redis_auth"),err) |
| 34 | + panic(err) | ||
| 35 | } | 35 | } |
| 36 | dataSource := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?loc=Asia%%2FShanghai", | 36 | dataSource := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?loc=Asia%%2FShanghai", |
| 37 | beego.AppConfig.String("mysql_user"), | 37 | beego.AppConfig.String("mysql_user"), |
| @@ -10,7 +10,7 @@ import ( | @@ -10,7 +10,7 @@ import ( | ||
| 10 | type AuditTemplate struct { | 10 | type AuditTemplate struct { |
| 11 | Id int64 `orm:"column(id);pk" description:"唯一编号"` | 11 | Id int64 `orm:"column(id);pk" description:"唯一编号"` |
| 12 | CompanyId int `orm:"column(company_id)" description:"公司id"` | 12 | CompanyId int `orm:"column(company_id)" description:"公司id"` |
| 13 | - ChanceType int `orm:"column(chance_type)" description:"机会类型"` | 13 | + ChanceTypeId int `orm:"column(chance_type_id)" description:"机会类型编号"` |
| 14 | Name string `orm:"column(name);size(20)" description:"子分类名称"` | 14 | Name string `orm:"column(name);size(20)" description:"子分类名称"` |
| 15 | Doc string `orm:"column(doc);size(255)" description:"说明"` | 15 | Doc string `orm:"column(doc);size(255)" description:"说明"` |
| 16 | Icon string `orm:"column(icon);size(255)" description:"图标"` | 16 | Icon string `orm:"column(icon);size(255)" description:"图标"` |
| @@ -82,7 +82,7 @@ func DeleteAuditTemplate(id int64) (err error) { | @@ -82,7 +82,7 @@ func DeleteAuditTemplate(id int64) (err error) { | ||
| 82 | 82 | ||
| 83 | func GetAuditTemplates(companyId int64, chanceType int) (v []*AuditTemplate, err error) { | 83 | func GetAuditTemplates(companyId int64, chanceType int) (v []*AuditTemplate, err error) { |
| 84 | o := orm.NewOrm() | 84 | o := orm.NewOrm() |
| 85 | - sql := "select * from audit_template where company_id=? and chance_type=? and enable_status=1" | 85 | + sql := "select * from audit_template where company_id=? and chance_type_id=? and enable_status=1" |
| 86 | if _, err = o.Raw(sql, companyId, chanceType).QueryRows(&v); err == nil { | 86 | if _, err = o.Raw(sql, companyId, chanceType).QueryRows(&v); err == nil { |
| 87 | return | 87 | return |
| 88 | } | 88 | } |
| @@ -15,7 +15,7 @@ type Chance struct { | @@ -15,7 +15,7 @@ type Chance struct { | ||
| 15 | UserId int64 `orm:"column(user_id)" description:"表user.id 用户id"` | 15 | UserId int64 `orm:"column(user_id)" description:"表user.id 用户id"` |
| 16 | CompanyId int64 `orm:"column(company_id)" description:"表company.id 公司id"` | 16 | CompanyId int64 `orm:"column(company_id)" description:"表company.id 公司id"` |
| 17 | DepartmentId int64 `orm:"column(department_id)" description:"表department.id 部门id"` | 17 | DepartmentId int64 `orm:"column(department_id)" description:"表department.id 部门id"` |
| 18 | - ChanceType int `orm:"column(chance_type)" description:"表chance_type.id 机会类型 "` | 18 | + ChanceTypeId int `orm:"column(chance_type_id)" description:"表chance_type.id 机会类型 "` |
| 19 | AuditTemplateId int64 `orm:"column(audit_template_id)" description:"表audit_template.id 所属审批模板编号"` | 19 | AuditTemplateId int64 `orm:"column(audit_template_id)" description:"表audit_template.id 所属审批模板编号"` |
| 20 | AuditTemplateConfig string `orm:"column(audit_template_config);size(255);null" description:"模板配置 (存旧的配置信息,对新改动的不影响)"` | 20 | AuditTemplateConfig string `orm:"column(audit_template_config);size(255);null" description:"模板配置 (存旧的配置信息,对新改动的不影响)"` |
| 21 | Content string `orm:"column(content)" description:"格式化后的文本内容"` | 21 | Content string `orm:"column(content)" description:"格式化后的文本内容"` |
models/chance_data.go
0 → 100644
| 1 | +package models | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "time" | ||
| 6 | + | ||
| 7 | + "github.com/astaxie/beego/orm" | ||
| 8 | +) | ||
| 9 | + | ||
| 10 | +type ChanceData struct { | ||
| 11 | + Id int64 `orm:"column(id)" description:"唯一编号"` | ||
| 12 | + ChanceId int64 `orm:"column(chance_id);null" description:"表chance.id 机会编号"` | ||
| 13 | + Images string `orm:"column(images);size(1000);null" description:"图片 json"` | ||
| 14 | + Speechs string `orm:"column(speechs);size(1000);null" description:"语音 json"` | ||
| 15 | + Videos string `orm:"column(videos);size(1000);null" description:"视频 json"` | ||
| 16 | + CreateAt time.Time `orm:"column(create_at);type(timestamp);null" description:"创建时间"` | ||
| 17 | + UpdateAt time.Time `orm:"column(update_at);type(timestamp);null" description:"更新时间"` | ||
| 18 | +} | ||
| 19 | + | ||
| 20 | +func (t *ChanceData) TableName() string { | ||
| 21 | + return "chance_data" | ||
| 22 | +} | ||
| 23 | + | ||
| 24 | +func init() { | ||
| 25 | + orm.RegisterModel(new(ChanceData)) | ||
| 26 | +} | ||
| 27 | + | ||
| 28 | +// AddChanceData insert a new ChanceData into database and returns | ||
| 29 | +// last inserted Id on success. | ||
| 30 | +func AddChanceData(m *ChanceData) (id int64, err error) { | ||
| 31 | + o := orm.NewOrm() | ||
| 32 | + id, err = o.Insert(m) | ||
| 33 | + return | ||
| 34 | +} | ||
| 35 | + | ||
| 36 | +// GetChanceDataById retrieves ChanceData by Id. Returns error if | ||
| 37 | +// Id doesn't exist | ||
| 38 | +func GetChanceDataById(id int64) (v *ChanceData, err error) { | ||
| 39 | + o := orm.NewOrm() | ||
| 40 | + v = &ChanceData{Id: id} | ||
| 41 | + if err = o.Read(v); err == nil { | ||
| 42 | + return v, nil | ||
| 43 | + } | ||
| 44 | + return nil, err | ||
| 45 | +} | ||
| 46 | + | ||
| 47 | +// UpdateChanceData updates ChanceData by Id and returns error if | ||
| 48 | +// the record to be updated doesn't exist | ||
| 49 | +func UpdateChanceDataById(m *ChanceData) (err error) { | ||
| 50 | + o := orm.NewOrm() | ||
| 51 | + v := ChanceData{Id: m.Id} | ||
| 52 | + // ascertain id exists in the database | ||
| 53 | + if err = o.Read(&v); err == nil { | ||
| 54 | + var num int64 | ||
| 55 | + if num, err = o.Update(m); err == nil { | ||
| 56 | + fmt.Println("Number of records updated in database:", num) | ||
| 57 | + } | ||
| 58 | + } | ||
| 59 | + return | ||
| 60 | +} | ||
| 61 | + | ||
| 62 | +// DeleteChanceData deletes ChanceData by Id and returns error if | ||
| 63 | +// the record to be deleted doesn't exist | ||
| 64 | +func DeleteChanceData(id int64) (err error) { | ||
| 65 | + o := orm.NewOrm() | ||
| 66 | + v := ChanceData{Id: id} | ||
| 67 | + // ascertain id exists in the database | ||
| 68 | + if err = o.Read(&v); err == nil { | ||
| 69 | + var num int64 | ||
| 70 | + if num, err = o.Delete(&ChanceData{Id: id}); err == nil { | ||
| 71 | + fmt.Println("Number of records deleted in database:", num) | ||
| 72 | + } | ||
| 73 | + } | ||
| 74 | + return | ||
| 75 | +} | ||
| 76 | + | ||
| 77 | +func GetChanceDataByChanceId(chanceId int64) (v *ChanceData, err error) { | ||
| 78 | + o := orm.NewOrm() | ||
| 79 | + sql :=`select * from chance_data where chance_id=?` | ||
| 80 | + if err = o.Raw(sql,chanceId).QueryRow(&v); err == nil { | ||
| 81 | + return v, nil | ||
| 82 | + } | ||
| 83 | + return nil, err | ||
| 84 | +} |
| @@ -154,3 +154,15 @@ func DeleteCompany(id int64) (err error) { | @@ -154,3 +154,15 @@ func DeleteCompany(id int64) (err error) { | ||
| 154 | } | 154 | } |
| 155 | return | 155 | return |
| 156 | } | 156 | } |
| 157 | + | ||
| 158 | +func GetCompanyByPermission(uid int64) (v []*Company, err error) { | ||
| 159 | + o := orm.NewOrm() | ||
| 160 | + sql := `select * from company where id in( | ||
| 161 | + select company_id from user_company where user_id=? and enable=1 | ||
| 162 | + ) and enable=1` // | ||
| 163 | + if _,err = o.Raw(sql, uid).QueryRows(&v); err == nil { | ||
| 164 | + return v, nil | ||
| 165 | + } | ||
| 166 | + return nil, err | ||
| 167 | +} | ||
| 168 | + |
| @@ -7,6 +7,10 @@ const ( | @@ -7,6 +7,10 @@ const ( | ||
| 7 | LoginTypeSmdcode = "signInCaptcha" | 7 | LoginTypeSmdcode = "signInCaptcha" |
| 8 | ) | 8 | ) |
| 9 | 9 | ||
| 10 | +const( | ||
| 11 | + DeviceType =1 | ||
| 12 | +) | ||
| 13 | + | ||
| 10 | const TokenExpire = 3600 | 14 | const TokenExpire = 3600 |
| 11 | 15 | ||
| 12 | const SmscodeDayLimitTime = 10 //短信验证码每天最多发10次 | 16 | const SmscodeDayLimitTime = 10 //短信验证码每天最多发10次 |
| @@ -88,7 +88,7 @@ type ChanceTypeResponse struct { | @@ -88,7 +88,7 @@ type ChanceTypeResponse struct { | ||
| 88 | 88 | ||
| 89 | /*Templates */ | 89 | /*Templates */ |
| 90 | type TemplatesRequest struct { | 90 | type TemplatesRequest struct { |
| 91 | - ChanceType int `json:"chance_type" valid:"Required"` | 91 | + ChanceTypeId int `json:"chanceTypeId" valid:"Required"` |
| 92 | } | 92 | } |
| 93 | type TemplatesResponse struct { | 93 | type TemplatesResponse struct { |
| 94 | Templates []*Template `json:"list"` | 94 | Templates []*Template `json:"list"` |
| @@ -99,26 +99,27 @@ type Template struct { | @@ -99,26 +99,27 @@ type Template struct { | ||
| 99 | Name string `json:"name"` | 99 | Name string `json:"name"` |
| 100 | Doc string `json:"doc"` | 100 | Doc string `json:"doc"` |
| 101 | Icon string `json:"icon"` | 101 | Icon string `json:"icon"` |
| 102 | - FormList []*Form `json:"form_list"` | 102 | + FormList []*Form `json:"formList"` |
| 103 | } | 103 | } |
| 104 | 104 | ||
| 105 | type Form struct { | 105 | type Form struct { |
| 106 | Id int `json:"id"` | 106 | Id int `json:"id"` |
| 107 | Lable string `json:"name"` | 107 | Lable string `json:"name"` |
| 108 | - InputType string `json:"input_type"` | ||
| 109 | - SectionType int8 `json:"section_type"` | 108 | + InputType string `json:"inputType"` |
| 109 | + SectionType int8 `json:"sectionType"` | ||
| 110 | Value string `json:"value"` | 110 | Value string `json:"value"` |
| 111 | Required int8 `json:"required"` | 111 | Required int8 `json:"required"` |
| 112 | } | 112 | } |
| 113 | 113 | ||
| 114 | type ChanceSubmitRequest struct { | 114 | type ChanceSubmitRequest struct { |
| 115 | - AuditTemplateId int64 `json:"audit_template_id" valid:"Required"` | 115 | + Id int64 `json:"id"` // = 0添加 >0 编辑 |
| 116 | + AuditTemplateId int64 `json:"auditTemplateId" valid:"Required"` | ||
| 116 | Content string `json:"content" valid:"Required"` | 117 | Content string `json:"content" valid:"Required"` |
| 117 | - FormList []*Form `json:"form_list" valid:"Required"` | 118 | + FormList []*Form `json:"formList" valid:"Required"` |
| 118 | Speechs []Speech `json:"speechs"` | 119 | Speechs []Speech `json:"speechs"` |
| 119 | Pictures []Picture `json:"pictures"` | 120 | Pictures []Picture `json:"pictures"` |
| 120 | Videos []Video `json:"videos"` | 121 | Videos []Video `json:"videos"` |
| 121 | - RelatedDepartment int64 `json:"related_departments" valid:"Required"` | 122 | + RelatedDepartment int64 `json:"relatedDepartments" valid:"Required"` |
| 122 | } | 123 | } |
| 123 | 124 | ||
| 124 | type ChanceSubmitResponse struct { | 125 | type ChanceSubmitResponse struct { |
| @@ -3,13 +3,14 @@ package protocol | @@ -3,13 +3,14 @@ package protocol | ||
| 3 | import "time" | 3 | import "time" |
| 4 | 4 | ||
| 5 | const ( | 5 | const ( |
| 6 | - DepartmentAll = iota + 1 //公司所有部门 | ||
| 7 | - DepartmentUser //用户所有部门 | 6 | + DepartmentUser = iota //用户所有部门 |
| 7 | + DepartmentAll //公司所有部门 | ||
| 8 | ) | 8 | ) |
| 9 | 9 | ||
| 10 | /*Departments */ | 10 | /*Departments */ |
| 11 | type DepartmentsRequest struct { | 11 | type DepartmentsRequest struct { |
| 12 | - Type int `json:"type" valid:"Required"` //1:公司所有部门 2:用户所在部门 | 12 | + //Type int `json:"type" valid:"Required"` //1:公司所有部门 2:用户所在部门 |
| 13 | + Type int `json:"type"` //0:用户所在部门 1:公司所有部门 | ||
| 13 | } | 14 | } |
| 14 | type DepartmentsResponse struct { | 15 | type DepartmentsResponse struct { |
| 15 | Departments []*Department `json:"departments,omitempty"` | 16 | Departments []*Department `json:"departments,omitempty"` |
| @@ -26,7 +26,7 @@ var errmessge ErrorMap = map[int]string{ | @@ -26,7 +26,7 @@ var errmessge ErrorMap = map[int]string{ | ||
| 26 | 4140: "refreshToken过期,需要重新登录授权", | 26 | 4140: "refreshToken过期,需要重新登录授权", |
| 27 | 4141: "accessToken过期或无效,需要进行重新获取令牌", | 27 | 4141: "accessToken过期或无效,需要进行重新获取令牌", |
| 28 | 4142: "Uuid已存在,请求失败", | 28 | 4142: "Uuid已存在,请求失败", |
| 29 | - | 29 | + 4201: "无该公司", |
| 30 | 5000: "繁忙,请稍后再试", | 30 | 5000: "繁忙,请稍后再试", |
| 31 | } | 31 | } |
| 32 | 32 |
| @@ -36,11 +36,12 @@ type ChangePasswordResponse struct { | @@ -36,11 +36,12 @@ type ChangePasswordResponse struct { | ||
| 36 | type UserCompanysRequest struct { | 36 | type UserCompanysRequest struct { |
| 37 | } | 37 | } |
| 38 | type UserCompanysResponse struct { | 38 | type UserCompanysResponse struct { |
| 39 | + Companys []Company `json:"companys"` | ||
| 39 | } | 40 | } |
| 40 | 41 | ||
| 41 | /*SwitchCompany */ | 42 | /*SwitchCompany */ |
| 42 | type SwitchCompanyRequest struct { | 43 | type SwitchCompanyRequest struct { |
| 43 | - CompanyId int64 `json:"company_id" valid:"Required"` | 44 | + CompanyId int64 `json:"companyId" valid:"Required"` |
| 44 | } | 45 | } |
| 45 | type SwitchCompanyResponse struct { | 46 | type SwitchCompanyResponse struct { |
| 46 | } | 47 | } |
| @@ -103,3 +104,9 @@ type User struct { | @@ -103,3 +104,9 @@ type User struct { | ||
| 103 | CompanyId int `json:"companyId"` | 104 | CompanyId int `json:"companyId"` |
| 104 | Company string `json:"company"` //公司名称 | 105 | Company string `json:"company"` //公司名称 |
| 105 | } | 106 | } |
| 107 | + | ||
| 108 | + | ||
| 109 | +type Company struct { | ||
| 110 | + Id int64 `json:"id"` | ||
| 111 | + Name string `json:"name"` | ||
| 112 | +} |
| @@ -57,14 +57,6 @@ func init() { | @@ -57,14 +57,6 @@ func init() { | ||
| 57 | 57 | ||
| 58 | beego.GlobalControllerRouter["opp/controllers/v1:ChanceController"] = append(beego.GlobalControllerRouter["opp/controllers/v1:ChanceController"], | 58 | beego.GlobalControllerRouter["opp/controllers/v1:ChanceController"] = append(beego.GlobalControllerRouter["opp/controllers/v1:ChanceController"], |
| 59 | beego.ControllerComments{ | 59 | beego.ControllerComments{ |
| 60 | - Method: "ChanceSubmit", | ||
| 61 | - Router: `/chanceSubmit`, | ||
| 62 | - AllowHTTPMethods: []string{"post"}, | ||
| 63 | - MethodParams: param.Make(), | ||
| 64 | - Params: nil}) | ||
| 65 | - | ||
| 66 | - beego.GlobalControllerRouter["opp/controllers/v1:ChanceController"] = append(beego.GlobalControllerRouter["opp/controllers/v1:ChanceController"], | ||
| 67 | - beego.ControllerComments{ | ||
| 68 | Method: "ChanceType", | 60 | Method: "ChanceType", |
| 69 | Router: `/chanceType`, | 61 | Router: `/chanceType`, |
| 70 | AllowHTTPMethods: []string{"post"}, | 62 | AllowHTTPMethods: []string{"post"}, |
| @@ -121,6 +113,14 @@ func init() { | @@ -121,6 +113,14 @@ func init() { | ||
| 121 | 113 | ||
| 122 | beego.GlobalControllerRouter["opp/controllers/v1:ChanceController"] = append(beego.GlobalControllerRouter["opp/controllers/v1:ChanceController"], | 114 | beego.GlobalControllerRouter["opp/controllers/v1:ChanceController"] = append(beego.GlobalControllerRouter["opp/controllers/v1:ChanceController"], |
| 123 | beego.ControllerComments{ | 115 | beego.ControllerComments{ |
| 116 | + Method: "ChanceSubmit", | ||
| 117 | + Router: `/submit`, | ||
| 118 | + AllowHTTPMethods: []string{"post"}, | ||
| 119 | + MethodParams: param.Make(), | ||
| 120 | + Params: nil}) | ||
| 121 | + | ||
| 122 | + beego.GlobalControllerRouter["opp/controllers/v1:ChanceController"] = append(beego.GlobalControllerRouter["opp/controllers/v1:ChanceController"], | ||
| 123 | + beego.ControllerComments{ | ||
| 124 | Method: "SympathyAction", | 124 | Method: "SympathyAction", |
| 125 | Router: `/sympathyAction`, | 125 | Router: `/sympathyAction`, |
| 126 | AllowHTTPMethods: []string{"post"}, | 126 | AllowHTTPMethods: []string{"post"}, |
| @@ -147,7 +147,7 @@ func GetChance(chanceId int64, companyId int64) (v *protocol.ChanceDetail, err e | @@ -147,7 +147,7 @@ func GetChance(chanceId int64, companyId int64) (v *protocol.ChanceDetail, err e | ||
| 147 | Provider: baseUserInfo, | 147 | Provider: baseUserInfo, |
| 148 | 148 | ||
| 149 | Content: c.Content, | 149 | Content: c.Content, |
| 150 | - ChanceType: c.ChanceType, | 150 | + ChanceType: c.ChanceTypeId, |
| 151 | ViewTotal: c.ViewTotal, | 151 | ViewTotal: c.ViewTotal, |
| 152 | CommentTotal: c.CommentTotal, | 152 | CommentTotal: c.CommentTotal, |
| 153 | ZanTotal: c.ZanTotal, | 153 | ZanTotal: c.ZanTotal, |
| @@ -76,7 +76,7 @@ func SympathyAction(header *protocol.RequestHeader, request *protocol.SympathyAc | @@ -76,7 +76,7 @@ func SympathyAction(header *protocol.RequestHeader, request *protocol.SympathyAc | ||
| 76 | log.Error("机会不存在", err) | 76 | log.Error("机会不存在", err) |
| 77 | return | 77 | return |
| 78 | } | 78 | } |
| 79 | - chanceType = chance.ChanceType | 79 | + chanceType = chance.ChanceTypeId |
| 80 | table = "chance" | 80 | table = "chance" |
| 81 | } | 81 | } |
| 82 | if chanceFavoirte != nil { | 82 | if chanceFavoirte != nil { |
| @@ -159,7 +159,7 @@ func Templates(header *protocol.RequestHeader, request *protocol.TemplatesReques | @@ -159,7 +159,7 @@ func Templates(header *protocol.RequestHeader, request *protocol.TemplatesReques | ||
| 159 | forms []*models.AuditForm | 159 | forms []*models.AuditForm |
| 160 | ) | 160 | ) |
| 161 | rsp = &protocol.TemplatesResponse{} | 161 | rsp = &protocol.TemplatesResponse{} |
| 162 | - if templates, err = models.GetAuditTemplates(header.CompanyId, request.ChanceType); err != nil { | 162 | + if templates, err = models.GetAuditTemplates(header.CompanyId, request.ChanceTypeId); err != nil { |
| 163 | log.Error(err) | 163 | log.Error(err) |
| 164 | return | 164 | return |
| 165 | } | 165 | } |
| @@ -225,7 +225,7 @@ func ChanceSubmit(header *protocol.RequestHeader, request *protocol.ChanceSubmit | @@ -225,7 +225,7 @@ func ChanceSubmit(header *protocol.RequestHeader, request *protocol.ChanceSubmit | ||
| 225 | Id: idgen.Next(), | 225 | Id: idgen.Next(), |
| 226 | UserId: header.Uid, | 226 | UserId: header.Uid, |
| 227 | CompanyId: header.CompanyId, | 227 | CompanyId: header.CompanyId, |
| 228 | - ChanceType: template.ChanceType, | 228 | + ChanceTypeId: template.ChanceTypeId, |
| 229 | AuditTemplateId: template.Id, | 229 | AuditTemplateId: template.Id, |
| 230 | AuditTemplateConfig: common.AssertJson(auditConfig), | 230 | AuditTemplateConfig: common.AssertJson(auditConfig), |
| 231 | Content: request.Content, | 231 | Content: request.Content, |
| @@ -255,30 +255,119 @@ func ChanceSubmit(header *protocol.RequestHeader, request *protocol.ChanceSubmit | @@ -255,30 +255,119 @@ func ChanceSubmit(header *protocol.RequestHeader, request *protocol.ChanceSubmit | ||
| 255 | orm.Rollback() | 255 | orm.Rollback() |
| 256 | return | 256 | return |
| 257 | } | 257 | } |
| 258 | - | ||
| 259 | } | 258 | } |
| 260 | //6.文件 | 259 | //6.文件 |
| 261 | - for _, v := range GenSpeechs(chance.Id, request.Speechs) { | ||
| 262 | - if _, err = orm.Insert(v); err != nil { | 260 | + { |
| 261 | + data :=&models.ChanceData{ | ||
| 262 | + Id:idgen.Next(), | ||
| 263 | + ChanceId:chance.Id, | ||
| 264 | + Speechs:common.AssertJson(request.Speechs), | ||
| 265 | + Images:common.AssertJson(request.Pictures), | ||
| 266 | + Videos:common.AssertJson(request.Videos), | ||
| 267 | + CreateAt:time.Now(), | ||
| 268 | + UpdateAt:time.Now(), | ||
| 269 | + } | ||
| 270 | + if _, err = orm.Insert(data); err != nil { | ||
| 263 | log.Error(err) | 271 | log.Error(err) |
| 264 | orm.Rollback() | 272 | orm.Rollback() |
| 265 | return | 273 | return |
| 266 | } | 274 | } |
| 267 | } | 275 | } |
| 268 | - for _, v := range GenVideos(chance.Id, request.Videos) { | ||
| 269 | - if _, err = orm.Insert(v); err != nil { | 276 | + orm.Commit() |
| 277 | + | ||
| 278 | + //6.激活审核流 | ||
| 279 | + //TODO:7.发送消息通知给审核人(审核消息) | ||
| 280 | + rsp = &protocol.ChanceSubmitResponse{} | ||
| 281 | + return | ||
| 282 | +} | ||
| 283 | + | ||
| 284 | +func ChanceUpdate(header *protocol.RequestHeader, request *protocol.ChanceSubmitRequest) (rsp *protocol.ChanceSubmitResponse, err error) { | ||
| 285 | + var ( | ||
| 286 | + template *models.AuditTemplate | ||
| 287 | + chance *models.Chance | ||
| 288 | + auditConfig *protocol.AuditConfig | ||
| 289 | + chanceData *models.ChanceData | ||
| 290 | + //auditFlows []*models.AuditFlowProcess | ||
| 291 | + updateMap =make(map[string]interface{}) | ||
| 292 | + ) | ||
| 293 | + if chance,err =models.GetChanceById(request.Id);err!=nil{ | ||
| 294 | + log.Error(err) | ||
| 295 | + return | ||
| 296 | + } | ||
| 297 | + //TODO:非本人 1.需要验证角色权限,是否是审核人 | ||
| 298 | + if chance.UserId!=header.Uid{ | ||
| 299 | + err = protocol.NewErrWithMessage(1) | ||
| 300 | + log.Error(fmt.Sprintf("user:%v 无权限操作机会 chance:%v",header.Uid,chance.Id)) | ||
| 301 | + return | ||
| 302 | + } | ||
| 303 | + //TODO:验证机会当前是否在审核中 | ||
| 304 | + //1.模板是否存在 | ||
| 305 | + if template, err = models.GetAuditTemplateById(request.AuditTemplateId); err != nil { | ||
| 306 | + log.Error("模板不存在:", request.AuditTemplateId, err) | ||
| 307 | + return | ||
| 308 | + } | ||
| 309 | + auditConfig = &protocol.AuditConfig{NoApprover: template.NoApprover} | ||
| 310 | + orm := orm.NewOrm() | ||
| 311 | + orm.Begin() | ||
| 312 | + { | ||
| 313 | + updateMap["AuditTemplateConfig"] = common.AssertJson(auditConfig) | ||
| 314 | + updateMap["Content"] = request.Content | ||
| 315 | + updateMap["SourceContent"] = common.AssertJson(request.FormList) | ||
| 316 | + updateMap["DepartmentId"] = request.RelatedDepartment | ||
| 317 | + | ||
| 318 | + if err = utils.UpdateTableByMapWithOrmer(orm,&models.Chance{Id:chance.Id},updateMap); err != nil { | ||
| 270 | log.Error(err) | 319 | log.Error(err) |
| 271 | orm.Rollback() | 320 | orm.Rollback() |
| 272 | return | 321 | return |
| 273 | } | 322 | } |
| 274 | } | 323 | } |
| 275 | - for _, v := range GenImages(chance.Id, request.Pictures) { | ||
| 276 | - if _, err = orm.Insert(v); err != nil { | 324 | + |
| 325 | + | ||
| 326 | + //4.查询审核配置 | ||
| 327 | + //5.生成审核流 删除旧的 生成新的 | ||
| 328 | + //if auditFlows, err = GenAuditFlowProcess(header, chance.Id, template.Id, auditConfig); err != nil { | ||
| 329 | + // log.Error(err) | ||
| 330 | + // orm.Rollback() | ||
| 331 | + // return | ||
| 332 | + //} | ||
| 333 | + //for i := 0; i < len(auditFlows); i++ { | ||
| 334 | + // if _, err = orm.Insert(auditFlows[i]); err != nil { | ||
| 335 | + // log.Error(err) | ||
| 336 | + // orm.Rollback() | ||
| 337 | + // return | ||
| 338 | + // } | ||
| 339 | + //} | ||
| 340 | + | ||
| 341 | + //6.更新文件 | ||
| 342 | + { | ||
| 343 | + if chanceData,err = models.GetChanceDataByChanceId(chance.Id);err==nil{ | ||
| 344 | + if err = utils.UpdateTableByMapWithOrmer(orm,chanceData,map[string]interface{}{ | ||
| 345 | + "Speechs":common.AssertJson(request.Speechs), | ||
| 346 | + "Images":common.AssertJson(request.Pictures), | ||
| 347 | + "Videos":common.AssertJson(request.Videos), | ||
| 348 | + "UpdateAt":time.Now(), | ||
| 349 | + });err!=nil{ | ||
| 350 | + log.Error(err) | ||
| 351 | + orm.Rollback() | ||
| 352 | + return | ||
| 353 | + } | ||
| 354 | + }else{ | ||
| 355 | + data :=&models.ChanceData{ | ||
| 356 | + Id:idgen.Next(), | ||
| 357 | + ChanceId:chance.Id, | ||
| 358 | + Speechs:common.AssertJson(request.Speechs), | ||
| 359 | + Images:common.AssertJson(request.Pictures), | ||
| 360 | + Videos:common.AssertJson(request.Videos), | ||
| 361 | + CreateAt:time.Now(), | ||
| 362 | + UpdateAt:time.Now(), | ||
| 363 | + } | ||
| 364 | + if _, err = orm.Insert(data); err != nil { | ||
| 277 | log.Error(err) | 365 | log.Error(err) |
| 278 | orm.Rollback() | 366 | orm.Rollback() |
| 279 | return | 367 | return |
| 280 | } | 368 | } |
| 281 | } | 369 | } |
| 370 | + } | ||
| 282 | orm.Commit() | 371 | orm.Commit() |
| 283 | 372 | ||
| 284 | //6.激活审核流 | 373 | //6.激活审核流 |
| @@ -179,8 +179,21 @@ func ChangePassword(header *protocol.RequestHeader, request *protocol.ChangePass | @@ -179,8 +179,21 @@ func ChangePassword(header *protocol.RequestHeader, request *protocol.ChangePass | ||
| 179 | 179 | ||
| 180 | //用户公司 | 180 | //用户公司 |
| 181 | func UserCompanys(header *protocol.RequestHeader, request *protocol.UserCompanysRequest) (rsp *protocol.UserCompanysResponse, err error) { | 181 | func UserCompanys(header *protocol.RequestHeader, request *protocol.UserCompanysRequest) (rsp *protocol.UserCompanysResponse, err error) { |
| 182 | - var () | 182 | + var ( |
| 183 | + companys []*models.Company | ||
| 184 | + ) | ||
| 183 | rsp = &protocol.UserCompanysResponse{} | 185 | rsp = &protocol.UserCompanysResponse{} |
| 186 | + if companys,err =models.GetCompanyByPermission(header.Uid);err!=nil{ | ||
| 187 | + log.Error(err) | ||
| 188 | + err = protocol.NewErrWithMessage(4201) //找不到这家公司 | ||
| 189 | + return | ||
| 190 | + } | ||
| 191 | + for i:=range companys{ | ||
| 192 | + rsp.Companys =append(rsp.Companys,protocol.Company{ | ||
| 193 | + Id:companys[i].Id, | ||
| 194 | + Name:companys[i].Name, | ||
| 195 | + }) | ||
| 196 | + } | ||
| 184 | return | 197 | return |
| 185 | } | 198 | } |
| 186 | 199 | ||
| @@ -193,12 +206,17 @@ func SwitchCompany(header *protocol.RequestHeader, request *protocol.SwitchCompa | @@ -193,12 +206,17 @@ func SwitchCompany(header *protocol.RequestHeader, request *protocol.SwitchCompa | ||
| 193 | rsp = &protocol.SwitchCompanyResponse{} | 206 | rsp = &protocol.SwitchCompanyResponse{} |
| 194 | if company, err = repository.UserCompany.GetUserCompanyByUserId(header.Uid, int64(request.CompanyId)); err != nil { | 207 | if company, err = repository.UserCompany.GetUserCompanyByUserId(header.Uid, int64(request.CompanyId)); err != nil { |
| 195 | log.Error(err) | 208 | log.Error(err) |
| 209 | + err = protocol.NewErrWithMessage(4201) //找不到这家公司 | ||
| 196 | return | 210 | return |
| 197 | } | 211 | } |
| 198 | - if auth, err = repository.UserAuth.GetUserAuthByUserId(header.Uid, header.DeviceType); err != nil { | 212 | + if auth, err = repository.UserAuth.GetUserAuthByUserId(header.Uid, protocol.DeviceType); err != nil { |
| 199 | log.Error(err) | 213 | log.Error(err) |
| 200 | return | 214 | return |
| 201 | } | 215 | } |
| 216 | + if auth.CurrentCompanyId == request.CompanyId{ | ||
| 217 | + log.Error(fmt.Sprintf("uid:%v 当前公司已经是:%v",header.Uid,request.CompanyId)) | ||
| 218 | + return | ||
| 219 | + } | ||
| 202 | if err = utils.UpdateTableByMap(&models.UserAuth{Id: auth.Id}, map[string]interface{}{"CurrentCompanyId": company.CompanyId}); err != nil { | 220 | if err = utils.UpdateTableByMap(&models.UserAuth{Id: auth.Id}, map[string]interface{}{"CurrentCompanyId": company.CompanyId}); err != nil { |
| 203 | log.Error(err) | 221 | log.Error(err) |
| 204 | return | 222 | return |
| @@ -271,3 +271,327 @@ | @@ -271,3 +271,327 @@ | ||
| 271 | } | 271 | } |
| 272 | } | 272 | } |
| 273 | ``` | 273 | ``` |
| 274 | + | ||
| 275 | +### 公司列表 | ||
| 276 | +* URL: /v1/user/userCompanys | ||
| 277 | +* 格式: JSON | ||
| 278 | +* HTTP请求方式: POST | ||
| 279 | +* 请求示例 | ||
| 280 | +```json | ||
| 281 | +{ | ||
| 282 | +} | ||
| 283 | +``` | ||
| 284 | + | ||
| 285 | +* 应答示例 | ||
| 286 | +```json | ||
| 287 | +{ | ||
| 288 | + "code": 0, | ||
| 289 | + "msg": "成功", | ||
| 290 | + "data": { | ||
| 291 | + "companys": [ | ||
| 292 | + { | ||
| 293 | + "id": 1, | ||
| 294 | + "name": "test_company" | ||
| 295 | + }, | ||
| 296 | + { | ||
| 297 | + "id": 2, | ||
| 298 | + "name": "dyt_company" | ||
| 299 | + } | ||
| 300 | + ] | ||
| 301 | + } | ||
| 302 | +} | ||
| 303 | +``` | ||
| 304 | + | ||
| 305 | + | ||
| 306 | +### 切换公司 | ||
| 307 | +* URL: /v1/user/switchCompany | ||
| 308 | +* 格式: JSON | ||
| 309 | +* HTTP请求方式: POST | ||
| 310 | +* 请求示例 | ||
| 311 | +```json | ||
| 312 | +{ | ||
| 313 | + "companyId":1 | ||
| 314 | +} | ||
| 315 | +``` | ||
| 316 | + | ||
| 317 | +* 应答示例 | ||
| 318 | +```json | ||
| 319 | +{ | ||
| 320 | + "code": 0, | ||
| 321 | + "msg": "成功", | ||
| 322 | + "data": {} | ||
| 323 | +} | ||
| 324 | +``` | ||
| 325 | + | ||
| 326 | + | ||
| 327 | +## 机会 | ||
| 328 | + | ||
| 329 | +### 机会类型 | ||
| 330 | +* URL: /v1/chance/chanceType | ||
| 331 | +* 格式: JSON | ||
| 332 | +* HTTP请求方式: POST | ||
| 333 | +* 请求示例 | ||
| 334 | +```json | ||
| 335 | +{ | ||
| 336 | +} | ||
| 337 | +``` | ||
| 338 | + | ||
| 339 | +* 应答示例 | ||
| 340 | +```json | ||
| 341 | +{ | ||
| 342 | + "code": 0, | ||
| 343 | + "msg": "成功", | ||
| 344 | + "data": { | ||
| 345 | + "list": [ | ||
| 346 | + { | ||
| 347 | + "id": 1, | ||
| 348 | + "name": "产品", | ||
| 349 | + "icon": "" | ||
| 350 | + }, | ||
| 351 | + { | ||
| 352 | + "id": 2, | ||
| 353 | + "name": "渠道", | ||
| 354 | + "icon": "" | ||
| 355 | + }, | ||
| 356 | + { | ||
| 357 | + "id": 3, | ||
| 358 | + "name": "客户", | ||
| 359 | + "icon": "" | ||
| 360 | + }, | ||
| 361 | + { | ||
| 362 | + "id": 4, | ||
| 363 | + "name": "区域", | ||
| 364 | + "icon": "" | ||
| 365 | + }, | ||
| 366 | + { | ||
| 367 | + "id": 5, | ||
| 368 | + "name": "其他", | ||
| 369 | + "icon": "" | ||
| 370 | + } | ||
| 371 | + ] | ||
| 372 | + } | ||
| 373 | +} | ||
| 374 | +``` | ||
| 375 | + | ||
| 376 | +### 机会模板 | ||
| 377 | +* URL: /v1/chance/templates | ||
| 378 | +* 格式: JSON | ||
| 379 | +* HTTP请求方式: POST | ||
| 380 | +* 请求示例 | ||
| 381 | +```json | ||
| 382 | +{ | ||
| 383 | + "chanceTypeId":1 | ||
| 384 | +} | ||
| 385 | +``` | ||
| 386 | + | ||
| 387 | +* 应答示例 | ||
| 388 | +```json | ||
| 389 | +{ | ||
| 390 | + "code": 0, | ||
| 391 | + "msg": "成功", | ||
| 392 | + "data": { | ||
| 393 | + "list": [ | ||
| 394 | + { | ||
| 395 | + "id": 1, | ||
| 396 | + "name": "产品-1", | ||
| 397 | + "doc": "新型产品1", | ||
| 398 | + "icon": "", | ||
| 399 | + "formList": [ | ||
| 400 | + { | ||
| 401 | + "id": 1, | ||
| 402 | + "name": "产品名称", | ||
| 403 | + "inputType": "text", | ||
| 404 | + "sectionType": 1, | ||
| 405 | + "value": "", | ||
| 406 | + "required": 0 | ||
| 407 | + }, | ||
| 408 | + { | ||
| 409 | + "id": 2, | ||
| 410 | + "name": "竞品", | ||
| 411 | + "inputType": "text", | ||
| 412 | + "sectionType": 2, | ||
| 413 | + "value": "", | ||
| 414 | + "required": 0 | ||
| 415 | + } | ||
| 416 | + ] | ||
| 417 | + } | ||
| 418 | + ] | ||
| 419 | + } | ||
| 420 | +} | ||
| 421 | +``` | ||
| 422 | + | ||
| 423 | +### 提交机会 | ||
| 424 | +* URL: /v1/chance/submit | ||
| 425 | +* 格式: JSON | ||
| 426 | +* HTTP请求方式: POST | ||
| 427 | +* 请求示例 | ||
| 428 | +```json | ||
| 429 | +{ | ||
| 430 | + "id":279802775016046593, | ||
| 431 | + "auditTemplateId": 1, | ||
| 432 | + "content": "是否素:是\n 出厂价格:¥100 \n", | ||
| 433 | + "formList": [{ | ||
| 434 | + "lable": "是否素食", | ||
| 435 | + "inputType": "text", | ||
| 436 | + "section": 1, | ||
| 437 | + "value": "" | ||
| 438 | + }, | ||
| 439 | + { | ||
| 440 | + "lable": "竞品", | ||
| 441 | + "inputType": "text", | ||
| 442 | + "section": 2, | ||
| 443 | + "value": "" | ||
| 444 | + } | ||
| 445 | + ], | ||
| 446 | + "speechs": [{ | ||
| 447 | + "path": "www.xx.com/file/xx/xx...", | ||
| 448 | + "duration": 60 | ||
| 449 | + }, | ||
| 450 | + { | ||
| 451 | + "path": "www.xx.com/file/xx/xx...", | ||
| 452 | + "duration": 30 | ||
| 453 | + } | ||
| 454 | + ], | ||
| 455 | + "pictures": [{ | ||
| 456 | + "path": "www.xx.com/file/xx/xx...", | ||
| 457 | + "w": 600, | ||
| 458 | + "h": 600 | ||
| 459 | + }, | ||
| 460 | + { | ||
| 461 | + "path": "www.xx.com/file/xx/xx...", | ||
| 462 | + "w": 600, | ||
| 463 | + "h": 600 | ||
| 464 | + } | ||
| 465 | + ], | ||
| 466 | + "videos": [{ | ||
| 467 | + "path": "www.xx.com/file/xx/xx...", | ||
| 468 | + "cover": "www.xx.com/file/xx/xx...", | ||
| 469 | + "duration": 60 | ||
| 470 | + }, | ||
| 471 | + { | ||
| 472 | + "path": "www.xx.com/file/xx/xx...", | ||
| 473 | + "cover": "www.xx.com/file/xx/xx...", | ||
| 474 | + "duration": 30 | ||
| 475 | + } | ||
| 476 | + ], | ||
| 477 | + "relatedDepartments": 1 | ||
| 478 | +} | ||
| 479 | +``` | ||
| 480 | + | ||
| 481 | +* 应答示例 | ||
| 482 | +```json | ||
| 483 | +{ | ||
| 484 | + "code": 0, | ||
| 485 | + "msg": "成功", | ||
| 486 | + "data": {} | ||
| 487 | +} | ||
| 488 | +``` | ||
| 489 | + | ||
| 490 | + | ||
| 491 | +## 文件上传 | ||
| 492 | + | ||
| 493 | +### 上传图片 | ||
| 494 | +* URL: /v1/upload/image | ||
| 495 | +* 格式: JSON | ||
| 496 | +* HTTP请求方式: POST | ||
| 497 | +* 请求示例 | ||
| 498 | +```json | ||
| 499 | +{ | ||
| 500 | +} | ||
| 501 | +``` | ||
| 502 | + | ||
| 503 | +``` | ||
| 504 | +form-data: file | ||
| 505 | +``` | ||
| 506 | + | ||
| 507 | +* 应答示例 | ||
| 508 | +```json | ||
| 509 | +{ | ||
| 510 | + "code": 0, | ||
| 511 | + "msg": "成功", | ||
| 512 | + "data": { | ||
| 513 | + "paths": [ | ||
| 514 | + "http:/192.168.139.137:8080/file/opp/image/20191214/1576290273_H7WDQpksZyXaGxmwKQDC5T6mhQBMTF3M.png" | ||
| 515 | + ] | ||
| 516 | + } | ||
| 517 | +} | ||
| 518 | +``` | ||
| 519 | + | ||
| 520 | +### 上传语音 | ||
| 521 | +* URL: /v1/upload/voice | ||
| 522 | +* 格式: JSON | ||
| 523 | +* HTTP请求方式: POST | ||
| 524 | +* 请求示例 | ||
| 525 | +```json | ||
| 526 | +{ | ||
| 527 | +} | ||
| 528 | +``` | ||
| 529 | + | ||
| 530 | +``` | ||
| 531 | +form-data: file | ||
| 532 | +``` | ||
| 533 | + | ||
| 534 | +* 应答示例 | ||
| 535 | +```json | ||
| 536 | +{ | ||
| 537 | + "code": 0, | ||
| 538 | + "msg": "成功", | ||
| 539 | + "data": { | ||
| 540 | + "paths": [ | ||
| 541 | + "http:/192.168.139.137:8080/file/opp/voice/20191214/1576290273_H7WDQpksZyXaGxmwKQDC5T6mhQBMTF3M.wav" | ||
| 542 | + ] | ||
| 543 | + } | ||
| 544 | +} | ||
| 545 | +``` | ||
| 546 | + | ||
| 547 | +### 上传视频 | ||
| 548 | +* URL: /v1/upload/video | ||
| 549 | +* 格式: JSON | ||
| 550 | +* HTTP请求方式: POST | ||
| 551 | +* 请求示例 | ||
| 552 | +```json | ||
| 553 | +{ | ||
| 554 | +} | ||
| 555 | +``` | ||
| 556 | + | ||
| 557 | +* 应答示例 | ||
| 558 | +```json | ||
| 559 | +{ | ||
| 560 | + "code": 0, | ||
| 561 | + "msg": "成功", | ||
| 562 | + "data": { | ||
| 563 | + "paths": [ | ||
| 564 | + "http:/192.168.139.137:8080/file/opp/video/20191214/1576290351_R3h4nQxxcMJ7ympktMsYBBQ6bAcFC6xj.mp3" | ||
| 565 | + ] | ||
| 566 | + } | ||
| 567 | +} | ||
| 568 | +``` | ||
| 569 | + | ||
| 570 | +## 部门统计 | ||
| 571 | + | ||
| 572 | +### 部门列表 | ||
| 573 | +* URL: /v1/department/departments | ||
| 574 | +* 格式: JSON | ||
| 575 | +* HTTP请求方式: POST | ||
| 576 | +* 请求示例 | ||
| 577 | +```json | ||
| 578 | +{ | ||
| 579 | + "type": 0 | ||
| 580 | +} | ||
| 581 | +``` | ||
| 582 | + | ||
| 583 | +* 应答示例 | ||
| 584 | +```json | ||
| 585 | +{ | ||
| 586 | + "code": 0, | ||
| 587 | + "msg": "成功", | ||
| 588 | + "data": { | ||
| 589 | + "departments": [ | ||
| 590 | + { | ||
| 591 | + "id": 1, | ||
| 592 | + "name": "部门1" | ||
| 593 | + } | ||
| 594 | + ] | ||
| 595 | + } | ||
| 596 | +} | ||
| 597 | +``` |
-
请 注册 或 登录 后发表评论