作者 yangfu

发布机会

@@ -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:"格式化后的文本内容"`
  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 +```