final_site.go 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214
  1. package final
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/gogf/gf/v2/util/gconv"
  6. "strings"
  7. "time"
  8. "zhiyuan/models"
  9. "zhiyuan/pkg/db"
  10. "zhiyuan/pkg/logger"
  11. "zhiyuan/pkg/utils"
  12. "zhiyuan/pkg/weixin/mp"
  13. "zhiyuan/services/admin"
  14. admin2 "zhiyuan/services/final/admin"
  15. "zhiyuan/services/user"
  16. "github.com/gin-gonic/gin"
  17. "github.com/gogf/gf/v2/os/gtime"
  18. )
  19. type FinalSite struct {
  20. ID int64 `json:"id" prop:"add:false"`
  21. PkgId int64 `json:"pkg_id" label:"套餐" type:"int" prop:"add:false edit:false" search:"multiple"`
  22. TypeId int64 `json:"type_id" label:"开工类型" type:"int" prop:"add:false edit:false" search:"multiple"`
  23. Username string `json:"username" label:"业主姓名" type:"string" prop:"add edit" search:"like"`
  24. Phone string `json:"phone" label:"手机号码" type:"string" prop:"add edit" search:"like"`
  25. AreaId int64 `json:"area_id" label:"区域" type:"int" prop:"add edit" search:"multiple"`
  26. CustomerId int64 `json:"customer_id" label:"客户" type:"int" prop:"edit:false" search:"="`
  27. OrderId int64 `json:"order_id" label:"合同" type:"int" prop:"edit:false" search:"="`
  28. Village string `json:"village" label:"小区名称" type:"string" prop:"edit" search:"like"`
  29. Address string `json:"address" label:"房屋地址" type:"string" prop:"edit" search:"like"`
  30. RoomNo string `json:"room_no" label:"楼栋房号" type:"string" prop:"edit" search:"like"`
  31. Areacode string `json:"areacode" label:"区划代码" type:"string" prop:"edit" search:"rightlike"`
  32. Name string `json:"name" label:"名称" type:"string" prop:"add:false select:concat(zy_final_site.village,'\\t',zy_final_site.address,'\\t',zy_final_site.room_no)" search:"like"`
  33. Room1 int64 `json:"room_1" label:"户型" type:"int" prop:"add:false edit:false" search:"="`
  34. Room2 int64 `json:"room_2" label:"户型" type:"int" prop:"add:false edit:false" search:"="`
  35. Room3 int64 `json:"room_3" label:"户型" type:"int" prop:"add:false edit:false" search:"="`
  36. Room4 int64 `json:"room_4" label:"户型" type:"int" prop:"add:false edit:false" search:"="`
  37. Room5 int64 `json:"room_5" label:"户型" type:"int" prop:"add:false edit:false" search:"="`
  38. Names string `json:"names" label:"名称" type:"string" prop:"add:false select:concat(zy_final_site.village,zy_final_site.address,zy_final_site.room_no)" search:"like"`
  39. Area float64 `json:"area" label:"面积" type:"float" prop:"add:false edit:false"`
  40. ShopId int64 `json:"shop_id" label:"门店" type:"int" prop:"add:false edit:false" search:"multiple"`
  41. ManagerId int64 `json:"manager_id" label:"项目经理" type:"int" prop:"edit" search:"multiple"`
  42. ProjectLeaderId int64 `json:"project_leader_id" label:"工程队长" type:"int" prop:"edit" search:"multiple"`
  43. DesignerId int64 `json:"designer_id" label:"设计师" type:"int" prop:"edit" search:"multiple"`
  44. StartTime int64 `json:"starttime" label:"开工日期" type:"int" prop:"add edit" search:"="`
  45. EndTime int64 `json:"endtime" label:"完工日期" type:"int" prop:""`
  46. CreatedId int64 `json:"created_id" label:"创建人员" type:"int" prop:"add:false" search:"="`
  47. ChangeState int64 `json:"change_state" label:"状态" type:"int" prop:"add:false edit" default:"0" search:"="`
  48. ChangeRemark string `json:"change_remark" label:"变更备注" type:"string" prop:"add:false edit"`
  49. Remark string `json:"remark" label:"备注" type:"string" prop:"add:false edit:false"`
  50. Activity string `json:"activity" label:"活动" type:"string" prop:"add:false edit:false"`
  51. Attachment string `json:"attachment" label:"附件" type:"string" prop:"add:false edit:false"`
  52. DeptId int64 `json:"dept_id" label:"归属部门" type:"int" prop:"add:false edit:false" search:"multiple"`
  53. SalesmanId int64 `json:"salesman_id" label:"业务员" type:"int" prop:"add:false edit:false" search:"multiple"`
  54. State int64 `json:"state" label:"状态" type:"int" prop:"add:false edit" default:"2"`
  55. ContactTime int64 `json:"contacttime" label:"接触时间" type:"int" prop:"edit" search:"="`
  56. StoreTime int64 `json:"storetime" label:"到店时间" type:"int" prop:"edit" search:"="`
  57. SignTime int64 `json:"signtime" label:"签订时间" type:"int" prop:"edit" search:"="`
  58. DeletedAt int64 `json:"deleted_at" prop:"add:false select:false"`
  59. CreatedAt int64 `json:"created_at" prop:"add:false"`
  60. UpdatedAt int64 `json:"updated_at" prop:"add:false"`
  61. db.BaseModel
  62. }
  63. func (FinalSite) TableName() string {
  64. return "zy_final_site"
  65. }
  66. func (model FinalSite) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool {
  67. s.Where = append(s.Where, fmt.Sprintf("`%s`.`state` in %s and `%s`.`manager_id` != %s", model.TableName(), s.Param([]int64{1, 2}), model.TableName(), s.Param(0)))
  68. if !admin.IsSuperAdmin(c.GetInt("adminID")) {
  69. adminID := s.Param(c.GetInt("adminID"))
  70. where := fmt.Sprintf("`%s`.`manager_id` = %s OR `%s`.`project_leader_id` = %s OR `%s`.`created_id` = %s", model.TableName(), adminID, model.TableName(), adminID, model.TableName(), adminID)
  71. if admin.CheckAuth([]string{"final:verify"}, c.GetInt("adminID")) {
  72. where = fmt.Sprintf("%s OR FIND_IN_SET(`%s`.`shop_id`, %s)", where, model.TableName(), "0")
  73. }
  74. s.Where = append(s.Where, fmt.Sprintf("(%s)", where))
  75. }
  76. if search, ok := data["search"]; ok {
  77. search = s.Param(fmt.Sprintf("%%%s%%", search))
  78. s.Where = append(s.Where, fmt.Sprintf("`%s`.`username` LIKE %s OR `%s`.`phone` LIKE %s OR concat(`%s`.`village`,`%s`.`address`,`%s`.`room_no`) LIKE %s", model.TableName(), search, model.TableName(), search, model.TableName(), model.TableName(), model.TableName(), search))
  79. }
  80. if starttime1s, ok := data["starttime1"]; ok {
  81. if starttime1, ok := db.ToInt64(starttime1s); ok {
  82. s.Where = append(s.Where, fmt.Sprintf("`%s`.`starttime` >= %s", model.TableName(), s.Param(starttime1)))
  83. }
  84. }
  85. if starttime2s, ok := data["starttime2"]; ok {
  86. if starttime2, ok := db.ToInt64(starttime2s); ok {
  87. s.Where = append(s.Where, fmt.Sprintf("`%s`.`starttime` < %s", model.TableName(), s.Param(starttime2+60*60*24)))
  88. }
  89. }
  90. if endtime1s, ok := data["endtime1"]; ok {
  91. if endtime1, ok := db.ToInt64(endtime1s); ok {
  92. s.Where = append(s.Where, fmt.Sprintf("`%s`.`endtime` >= %s", model.TableName(), s.Param(endtime1)))
  93. }
  94. }
  95. if endtime2s, ok := data["endtime2"]; ok {
  96. if endtime2, ok := db.ToInt64(endtime2s); ok {
  97. s.Where = append(s.Where, fmt.Sprintf("`%s`.`endtime` < %s", model.TableName(), s.Param(endtime2+60*60*24)))
  98. }
  99. }
  100. return true
  101. }
  102. func (FinalSite) OnePrivilege(c *gin.Context, id int64) bool {
  103. return true
  104. }
  105. func (FinalSite) AddPrivilege(c *gin.Context, data map[string]interface{}, post map[string]interface{}) error {
  106. var model FinalSite
  107. db.GetModel(map[string]interface{}{
  108. "village": data["village"],
  109. "room_no": data["room_no"],
  110. "deleted_at": 0,
  111. }, &model)
  112. if model.ID != 0 {
  113. return errors.New("工地已存在")
  114. }
  115. user, err := user.GetOne(map[string]interface{}{"phone": data["phone"]}, nil, nil)
  116. if err != nil {
  117. return errors.New("获取用户信息失败")
  118. }
  119. if user == nil {
  120. return errors.New("用户未关注公众号")
  121. }
  122. data["created_id"] = c.GetInt("adminID")
  123. return nil
  124. }
  125. func (FinalSite) AddAfter(c *gin.Context, id int64, post map[string]interface{}, data map[string]interface{}) {
  126. //todo 添加工地
  127. //加载节假日
  128. holidays := admin2.LoadHolidays()
  129. fmt.Println("000000 holidays 00000000000", holidays)
  130. // 查询套餐表
  131. //field := " select * from zy_mat_pick "
  132. //db.GetMultiRaw(field, map[string]interface{}{
  133. // "pkg_id": post["pkg_id"],
  134. //}, map[string]interface{}{}, &checkList)
  135. checkList, err := db.GetModelMap(db.Type(models.WorkQualityAcceptItem{}), map[string]interface{}{"state": 1}, nil)
  136. if err != nil {
  137. errors.New("施工节点未找到")
  138. return
  139. }
  140. siteStart := gtime.New(utils.ToInt(post["starttime"])).Format("Y-m-d")
  141. fmt.Println("开始时间", siteStart)
  142. var siteCompletionTime string
  143. sql := "INSERT INTO zy_mat_pick_work(site_id,pick_id,`name`,pictures,photograph,room_type,`cycle`,example_at) VALUES "
  144. for _, item := range checkList {
  145. //fmt.Println(item)
  146. domain := "https://image.nczyzs.com/"
  147. result := strings.ReplaceAll(utils.ToStr(item["pictures"]), domain, "")
  148. sql += "("
  149. sql += utils.ToStr(id) + ","
  150. sql += utils.ToStr(item["id"]) + "," //accept_item_id
  151. sql += "'" + utils.ToStr(item["content"]) + "'," //施工名称
  152. sql += "'" + result + "'," //图片
  153. sql += "'" + utils.ToStr(item["photograph"]) + "'," //施工标准
  154. sql += utils.ToStr(item["quality_accept_id"]) + ","
  155. sql += utils.ToStr(item["days"]) + ","
  156. endDate, _ := admin2.CalculateEndDate(holidays, siteStart, gconv.Int(item["days"]))
  157. sql += "'" + endDate + "'"
  158. //_ = fmt.Sprintf("节点:%s ,工期:%d, 结束节点:%s", item["pick_name"], item["cycle"], endDate)
  159. //gt1 := gtime.New(post["starttime"]).Add(gconv.Duration(gconv.Int(pkg["cycle"]) * 86400))
  160. sql += "),"
  161. siteCompletionTime = endDate
  162. }
  163. //移除最后一个逗号
  164. if len(sql) > 0 {
  165. sql = sql[:len(sql)-1]
  166. }
  167. _, err = db.InsertRaw(sql, nil)
  168. fmt.Println("添加工地", sql)
  169. if err == nil {
  170. MatPickWork{}.AddAfter(c, id, data, data)
  171. }
  172. //更新工地的完工时间
  173. err = db.UpdateModels(db.Type(FinalSite{}), map[string]interface{}{
  174. "id": id,
  175. "deleted_at": 0,
  176. }, map[string]interface{}{
  177. "endtime": gtime.New(siteCompletionTime).Unix(), //回写完工日期
  178. })
  179. fmt.Println("最终完工时间", siteCompletionTime)
  180. //if err != nil {
  181. // app.ErrorMsg(c, err.Error(), nil)
  182. // return
  183. //}
  184. //var model FinalSite
  185. //db.GetModel(map[string]interface{}{
  186. // "id": id,
  187. // "deleted_at": 0,
  188. //}, &model)
  189. //
  190. //address := model.Address
  191. //if model.Village != " " {
  192. // address += " " + model.Village
  193. //}
  194. //if model.RoomNo != " " {
  195. // address += " " + model.RoomNo
  196. //}
  197. //switch model.ShopId {
  198. //case 9, 13, 14, 18:
  199. // SendSiteMessage(1003, id, address, "工地已创建,请及时下单")
  200. //case 10, 12, 15:
  201. // SendSiteMessage(1004, id, address, "工地已创建,请及时下单")
  202. //case 6, 16:
  203. // SendSiteMessage(1257, id, address, "工地已创建,请及时下单")
  204. //case 7, 17:
  205. // SendSiteMessage(1173, id, address, "工地已创建,请及时下单")
  206. //}
  207. }
  208. func (FinalSite) EditPrivilege(c *gin.Context, id int64, data map[string]interface{}, post map[string]interface{}) error {
  209. //开工的工地不允许修改套餐,检查工地表开工时间和当前时间做对比
  210. //site, err := db.GetOneModelMap(db.Type(FinalSite{}), map[string]interface{}{"id": post["id"]}, nil)
  211. //if err != nil {
  212. // return errors.New("工地未找到")
  213. //}
  214. //startTime, _ := db.ToInt64(site["starttime"])
  215. //curTime := time.Now().Unix()
  216. //
  217. //if data["pkg_id"] != site["pkg_id"] && curTime > startTime {
  218. // return errors.New("工地已开工,套餐无法变更")
  219. //}
  220. //删除原有工作,写入新工作
  221. //var MatPickWork MatPickWork
  222. //_, err = db.Delete(MatPickWork.TableName(), map[string]interface{}{"site_id": id})
  223. //
  224. //sql := "INSERT INTO zy_mat_pick_work(site_id,pkg_id,pick_id,room_type,manager_id) SELECT {{site_id}},pkg_id,id,room_type,{{manager_id}} FROM zy_mat_pick WHERE pkg_id={{pkg_id}}"
  225. //_, err = db.InsertRaw(sql, map[string]interface{}{"site_id": id, "pkg_id": post["pkg_id"], "manager_id": data["manager_id"]})
  226. //if err == nil {
  227. // MatPickWork.EditAfter(c, id, data, data)
  228. //}
  229. return nil
  230. }
  231. func (FinalSite) DelPrivilege(c *gin.Context, id int64) error {
  232. return nil
  233. }
  234. func (FinalSite) Page() bool {
  235. return false
  236. }
  237. func (FinalSite) Count() bool {
  238. return true
  239. }
  240. func (model FinalSite) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel {
  241. return []db.JoinModel{}
  242. }
  243. func (model FinalSite) GroupBy() string {
  244. return fmt.Sprintf("`%s`.`id`", model.TableName())
  245. }
  246. type JoinAdmin struct {
  247. db.BaseModel
  248. }
  249. func (JoinAdmin) TableName() string {
  250. return "zy_admin"
  251. }
  252. type FinalSiteMobile struct {
  253. ManagerName string `json:"manager_name" type:"string" prop:"select:manager.username"`
  254. ManagerPhone string `json:"manager_phone" type:"string" prop:"select:manager.phone"`
  255. ManagerHeadImgUrl string `json:"manager_headimgurl" type:"string" prop:"select:manager.headimgurl"`
  256. DesignerName string `json:"designer_name" type:"string" prop:"select:designer.username"`
  257. DesignerPhone string `json:"designer_phone" type:"string" prop:"select:designer.phone"`
  258. DesignerHeadImgUrl string `json:"designer_headimgurl" type:"string" prop:"select:designer.headimgurl"`
  259. SalesmanName string `json:"salesman_name" type:"string" prop:"select:salesman.username"`
  260. SalesmanPhone string `json:"salesman_phone" type:"string" prop:"select:salesman.phone"`
  261. SalesmanHeadImgUrl string `json:"salesman_headimgurl" type:"string" prop:"select:salesman.headimgurl"`
  262. TableCount int64 `json:"table_count" type:"int" prop:"select:count(distinct(if(pickwork.deleted_at=0,pickwork.id,NULL)))"`
  263. Uncount int64 `json:"uncount" type:"int" prop:"select:count(distinct(IF((pickwork.deleted_at=0)AND(pickwork.item_status=0),pickwork.id,NULL)))"`
  264. HandleCount int64 `json:"handle_count" type:"int" prop:"select:count(distinct(IF((pickwork.deleted_at=0)AND(pickwork.item_status=2),pickwork.id,NULL)))"`
  265. FinishCount int64 `json:"finish_count" type:"int" prop:"select:count(distinct(IF((pickwork.deleted_at=0)AND(pickwork.item_status=1),pickwork.id,NULL)))"`
  266. //HandleCount int64 `json:"handle_count" type:"int" prop:"select:count(distinct(IF((pickwork.state>0)AND(finalsitetable.state<5),finalsitetable.id,NULL)))"`
  267. //FinishCount int64 `json:"finish_count" type:"int" prop:"select:count(distinct(IF(finalsitetable.state=5,finalsitetable.id,NULL)))"`
  268. //Count1 int64 `json:"count1" type:"int" prop:"select:count(distinct(IF(finalsitetable.state=1,finalsitetable.id,NULL)))"`
  269. //Count2 int64 `json:"count2" type:"int" prop:"select:count(distinct(IF(finalsitetable.state=2,finalsitetable.id,NULL)))"`
  270. //Count3 int64 `json:"count3" type:"int" prop:"select:count(distinct(IF(finalsitetable.state=3,finalsitetable.id,NULL)))"`
  271. //Count4 int64 `json:"count4" type:"int" prop:"select:count(distinct(IF(finalsitetable.state=4,finalsitetable.id,NULL)))"`
  272. SettleID int64 `json:"settle_id" type:"int" prop:"select:finalsettle.id"`
  273. SettleTotal float64 `json:"settle_total" type:"float" prop:"select:finalsettle.total"`
  274. SettleState int64 `json:"settle_state" type:"int" prop:"select:finalsettle.state"`
  275. SettleCreatedAt int64 `json:"settle_created_at" type:"int" prop:"select:finalsettle.created_at"`
  276. ShopName string `json:"shop_name" type:"string" prop:"select:shop.shop_name"`
  277. CollectInfo string `json:"collect_info" type:"string" prop:"select:shop.collect_info"`
  278. FinalSite
  279. }
  280. func (model FinalSiteMobile) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool {
  281. if state, ok := data["state"]; ok {
  282. if n, ok := db.ToInt64(state); ok {
  283. switch n {
  284. case 1:
  285. s.Having = append(s.Having, "count(IF((pickwork.item_status=0)OR(pickwork.item_status=2)OR(pickwork.item_status=3),pickwork.id,NULL))")
  286. case 2:
  287. s.Having = append(s.Having, "count(IF((pickwork.item_status=0)OR(pickwork.item_status=2),pickwork.id,NULL)) = 0 ")
  288. case 3:
  289. //s.Having = append(s.Having, "count(IF(pickwork.item_status==1,pickwork.id,NULL)) = 0")
  290. case 4:
  291. //s.Having = append(s.Having, "count(IF(finalsitetable.state=1,finalsitetable.id,NULL)) != 0")
  292. case 5:
  293. //s.Having = append(s.Having, "count(IF(finalsitetable.state=2,finalsitetable.id,NULL)) != 0")
  294. case 6:
  295. //s.Having = append(s.Having, "count(IF(finalsitetable.state=3,finalsitetable.id,NULL)) != 0")
  296. case 7:
  297. //s.Having = append(s.Having, "count(IF(finalsitetable.state=4,finalsitetable.id,NULL)) != 0")
  298. }
  299. }
  300. }
  301. if admin.CheckAuth([]string{"work:worksite:view"}, c.GetInt("adminID")) {
  302. s.Where = append(s.Where, fmt.Sprintf("(`manager`.`audit_id` = %s OR `manager`.`audit_id` = %s)", s.Param(c.GetInt("adminID")), s.Param(0)))
  303. fmt.Println("我有权限")
  304. } else {
  305. s.Where = append(s.Where, fmt.Sprintf("(`zy_final_site`.`manager_id` = %s)", s.Param(c.GetInt("adminID"))))
  306. }
  307. return model.FinalSite.ListPrivilege(c, data, s)
  308. }
  309. func (model FinalSiteMobile) ListAfter(c *gin.Context, data map[string]interface{}, list []map[string]interface{}) []map[string]interface{} {
  310. for n, item := range list {
  311. siteId := item["id"]
  312. params := make(map[string]interface{})
  313. params["site_id"] = siteId
  314. query := " SELECT w.room_type, a.name AS room_type_name,COUNT(w.id) AS total,SUM(CASE WHEN w.item_status = 1 THEN 1 ELSE 0 END) AS completed FROM zy_mat_pick_work w LEFT JOIN zy_work_quality_accept a ON w.room_type = a.id WHERE w.site_id = {{site_id}} AND w.deleted_at = 0 GROUP BY w.room_type, a.name ORDER BY w.room_type"
  315. params["adminID"] = c.GetInt("adminID")
  316. checkList, _ := db.QueryMap(query, params, nil)
  317. list[n]["static"] = checkList
  318. }
  319. return list
  320. }
  321. func (model FinalSiteMobile) GroupBy() string {
  322. return fmt.Sprintf("`%s`.`id`", model.TableName())
  323. }
  324. func (model FinalSiteMobile) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel {
  325. return append(model.FinalSite.LeftJoin(data, s),
  326. db.JoinModel{
  327. Model: JoinAdmin{},
  328. As: "manager",
  329. On: []string{"`manager`.`id` = " + model.TableName() + ".`manager_id`"},
  330. },
  331. db.JoinModel{
  332. Model: JoinAdmin{},
  333. As: "designer",
  334. On: []string{"`designer`.`id` = " + model.TableName() + ".`designer_id`"},
  335. },
  336. db.JoinModel{
  337. Model: JoinAdmin{},
  338. As: "salesman",
  339. On: []string{"`salesman`.`id` = " + model.TableName() + ".`salesman_id`"},
  340. },
  341. db.JoinModel{
  342. Model: JoinShop{},
  343. As: "shop",
  344. On: []string{"`shop`.`id` = " + model.TableName() + ".`shop_id`"},
  345. },
  346. db.JoinModel{
  347. Model: FinalMaterial{},
  348. As: "finalmaterial",
  349. On: []string{"`finalmaterial`.`site_id` = " + model.TableName() + ".`id` AND `finalmaterial`.`deleted_at` = 0"},
  350. },
  351. db.JoinModel{
  352. Model: MatPickWork{},
  353. As: "pickwork",
  354. On: []string{"`pickwork`.`site_id` = " + model.TableName() + ".`id`"},
  355. },
  356. db.JoinModel{
  357. Model: FinalSettle{},
  358. As: "finalsettle",
  359. On: []string{"`finalsettle`.`site_id` = " + model.TableName() + ".`id` AND `finalsettle`.`deleted_at` = 0"},
  360. })
  361. }
  362. type FinalSiteSupplier struct {
  363. ManagerName string `json:"manager_name" type:"string" prop:"select:manager.username"`
  364. ManagerPhone string `json:"manager_phone" type:"string" prop:"select:manager.phone"`
  365. ManagerHeadImgUrl string `json:"manager_headimgurl" type:"string" prop:"select:manager.headimgurl"`
  366. MaterialCount int64 `json:"count" type:"int" prop:"select:count(distinct(finalmaterial.id))"`
  367. Count2 int64 `json:"count2" type:"int" prop:"select:count(distinct(IF(finalmaterial.state=2,finalmaterial.id,NULL)))"`
  368. Count3 int64 `json:"count3" type:"int" prop:"select:count(distinct(IF(finalmaterial.state=3,finalmaterial.id,NULL)))"`
  369. Count4 int64 `json:"count4" type:"int" prop:"select:count(distinct(IF(finalmaterial.state=4,finalmaterial.id,NULL)))"`
  370. Count5 int64 `json:"count5" type:"int" prop:"select:count(distinct(IF(finalmaterial.state=5,finalmaterial.id,NULL)))"`
  371. Count6 int64 `json:"count6" type:"int" prop:"select:count(distinct(IF(finalmaterial.state=6,finalmaterial.id,NULL)))"`
  372. Count7 int64 `json:"count7" type:"int" prop:"select:count(distinct(IF(finalmaterial.state=7,finalmaterial.id,NULL)))"`
  373. Count8 int64 `json:"count8" type:"int" prop:"select:count(distinct(IF(finalmaterial.state=8,finalmaterial.id,NULL)))"`
  374. Count9 int64 `json:"count9" type:"int" prop:"select:count(distinct(IF(finalmaterial.state=9,finalmaterial.id,NULL)))"`
  375. Count10 int64 `json:"count10" type:"int" prop:"select:count(distinct(IF(finalmaterial.state=10,finalmaterial.id,NULL)))"`
  376. FinalSite
  377. }
  378. func (model FinalSiteSupplier) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool {
  379. if state, ok := data["state"]; ok {
  380. if n, ok := db.ToInt64(state); ok {
  381. switch n {
  382. case 2:
  383. s.Having = append(s.Having, "count(IF(finalmaterial.state=2,finalmaterial.id,NULL)) != 0")
  384. case 3:
  385. s.Having = append(s.Having, "count(IF(finalmaterial.state=3,finalmaterial.id,NULL)) != 0")
  386. case 4:
  387. s.Having = append(s.Having, "count(IF(finalmaterial.state=4,finalmaterial.id,NULL)) != 0")
  388. case 5:
  389. s.Having = append(s.Having, "count(IF(finalmaterial.state=5,finalmaterial.id,NULL)) != 0")
  390. case 6:
  391. s.Having = append(s.Having, "count(IF(finalmaterial.state=6,finalmaterial.id,NULL)) != 0")
  392. case 7:
  393. s.Having = append(s.Having, "count(IF(finalmaterial.state=7,finalmaterial.id,NULL)) != 0")
  394. case 8:
  395. s.Having = append(s.Having, "count(IF(finalmaterial.state=8,finalmaterial.id,NULL)) != 0")
  396. case 9:
  397. s.Having = append(s.Having, "count(IF(finalmaterial.state=9,finalmaterial.id,NULL)) != 0")
  398. case 10:
  399. s.Having = append(s.Having, "count(IF(finalmaterial.state=10,finalmaterial.id,NULL)) != 0")
  400. }
  401. }
  402. }
  403. s.Where = append(s.Where, fmt.Sprintf("`finalmaterial`.`supplier_id` = %s", s.Param(c.GetInt("adminID"))))
  404. if search, ok := data["search"]; ok {
  405. search = s.Param(fmt.Sprintf("%%%s%%", search))
  406. s.Where = append(s.Where, fmt.Sprintf("`%s`.`username` LIKE %s OR `%s`.`phone` LIKE %s OR concat(`%s`.`village`,`%s`.`address`,`%s`.`room_no`) LIKE %s", model.TableName(), search, model.TableName(), search, model.TableName(), model.TableName(), model.TableName(), search))
  407. }
  408. return true
  409. }
  410. func (model FinalSiteSupplier) ListAfter(c *gin.Context, data map[string]interface{}, list []map[string]interface{}) []map[string]interface{} {
  411. ids := make([]int64, 0)
  412. idmap := make(map[int64]int)
  413. for i, v := range list {
  414. id, _ := db.ToInt64(v["id"])
  415. ids = append(ids, id)
  416. idmap[id] = i
  417. }
  418. datas, _ := db.GetModelMap(db.Type(FinalMaterialItemSupplier{}), map[string]interface{}{
  419. "finalmaterial.site_id in ": ids,
  420. "finalmaterial.supplier_id": c.GetInt("adminID"),
  421. fmt.Sprintf("`%s`.`deleted_at`", FinalMaterialItemSupplier{}.TableName()): 0,
  422. }, nil)
  423. for _, v := range datas {
  424. id, _ := db.ToInt64(v["site_id"])
  425. mid, _ := db.ToInt64(v["material_id"])
  426. if n, ok := idmap[id]; ok {
  427. materials := make([]map[string]interface{}, 0)
  428. if ms, ok := list[n]["materials"].([]map[string]interface{}); ok {
  429. materials = ms
  430. }
  431. findmaterial := false
  432. for i, m := range materials {
  433. materialid, _ := db.ToInt64(m["id"])
  434. if materialid == mid {
  435. findmaterial = true
  436. items := make([]map[string]interface{}, 0)
  437. if is, ok := m["items"].([]map[string]interface{}); ok {
  438. items = is
  439. }
  440. items = append(items, v)
  441. materials[i]["items"] = items
  442. break
  443. }
  444. }
  445. if !findmaterial {
  446. material := map[string]interface{}{
  447. "id": v["material_id"],
  448. "name": v["name"],
  449. "type": v["type"],
  450. "budget": v["budget"],
  451. "budget_type": v["budget_type"],
  452. "total": v["total"],
  453. "state": v["state"],
  454. "receipt_date": v["receipt_date"],
  455. "items": []map[string]interface{}{v},
  456. }
  457. materials = append(materials, material)
  458. }
  459. list[n]["materials"] = materials
  460. }
  461. }
  462. return list
  463. }
  464. func (model FinalSiteSupplier) GroupBy() string {
  465. return fmt.Sprintf("`%s`.`id`", model.TableName())
  466. }
  467. func (model FinalSiteSupplier) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel {
  468. return []db.JoinModel{
  469. {
  470. Model: JoinAdmin{},
  471. As: "manager",
  472. On: []string{"`manager`.`id` = " + model.TableName() + ".`manager_id`"},
  473. },
  474. {
  475. Model: FinalMaterial{},
  476. As: "finalmaterial",
  477. On: []string{"`finalmaterial`.`site_id` = " + model.TableName() + ".`id` AND `finalmaterial`.`state` > 1 AND `finalmaterial`.`deleted_at` = 0"},
  478. },
  479. }
  480. }
  481. func SendSiteMessage(adminID int, siteId int64, address string, text string) error {
  482. logger.Sugar.Infof("SendSiteMessage, send: %v %v %v %v", adminID, siteId, address, text)
  483. client, err := mp.NewClient(1)
  484. if err != nil {
  485. return err
  486. }
  487. adminInfo, err := admin.GetInfoByID(adminID, nil, nil)
  488. if err != nil {
  489. return err
  490. }
  491. if adminInfo == nil || adminInfo.OpenId == "" {
  492. return nil
  493. }
  494. url := ""
  495. if siteId != 0 {
  496. url = "https://jz.nczyzs.com/final/#/detail/" + db.ToString(siteId)
  497. }
  498. ret, err := client.SendTemplateMessage(adminInfo.OpenId, "0tdzToVtXoCUrafmN-ub9J69HKKCfUWEsCan-WkuPKk", url, map[string]interface{}{
  499. "character_string1": map[string]interface{}{
  500. "value": db.ToString(siteId),
  501. },
  502. "thing2": map[string]interface{}{
  503. "value": utils.SubStr(address, 0, 20),
  504. },
  505. "thing5": map[string]interface{}{
  506. "value": utils.SubStr(text, 0, 20),
  507. },
  508. })
  509. logger.Sugar.Infof("SendSiteMessage, ret: %v %v", ret, err)
  510. return err
  511. }
  512. func SendSiteWorkMessage(adminID int, siteId int64, text string) error {
  513. return nil
  514. logger.Sugar.Infof("SendSiteWorkMessage, send: %v %v %v %v", adminID, siteId, text)
  515. client, err := mp.NewClient(1)
  516. if err != nil {
  517. return err
  518. }
  519. adminInfo, err := admin.GetInfoByID(adminID, nil, nil)
  520. if err != nil {
  521. return err
  522. }
  523. if adminInfo == nil || adminInfo.OpenId == "" {
  524. return nil
  525. }
  526. url := ""
  527. if siteId != 0 {
  528. url = "https://jz.nczyzs.com/final/#/detail/" + db.ToString(siteId)
  529. }
  530. ret, err := client.SendTemplateMessage(adminInfo.OpenId, "0tdzToVtXoCUrafmN-ub9J69HKKCfUWEsCan-WkuPKk", url, map[string]interface{}{
  531. "character_string1": map[string]interface{}{
  532. "value": db.ToString(siteId),
  533. },
  534. "thing5": map[string]interface{}{
  535. "value": utils.SubStr(text, 0, 20),
  536. },
  537. })
  538. logger.Sugar.Infof("SendSiteWorkMessage, ret: %v %v", ret, err)
  539. return err
  540. }
  541. type JoinWriteControl struct {
  542. db.BaseModel
  543. }
  544. func (JoinWriteControl) TableName() string {
  545. return "(select `id`,`site_id` from `zy_final_site_control` where `deleted_at` = 0 and `created_at` != `updated_at` group by `site_id`)"
  546. }
  547. type JoinPriceControl struct {
  548. db.BaseModel
  549. }
  550. func (JoinPriceControl) TableName() string {
  551. return "(select `id`,`site_id` from `zy_final_manager_price` where `deleted_at` = 0 group by `site_id`)"
  552. }
  553. type JoinApplyControl struct {
  554. db.BaseModel
  555. }
  556. func (JoinApplyControl) TableName() string {
  557. return "(select `id`, `site_id`, group_concat(concat(`name`, if(`settle_state` = 1,\"结算\", \"\"))) as `name`, count(`id`) as `manager_count` from (select `zy_final_site_control`.`id`, `zy_final_site_control`.`site_id`, `type`.`name` as `name`, IF((`zy_final_site_control`.`budget`!=0)and(count(distinct(IF(`table`.`state`<2,`table`.`id`,NULL)))=0)and(count(distinct(IF(`table`.`type`=1,`table`.`id`,NULL)))<`type`.`living_count`)and(count(distinct(IF(`table`.`type`=0,`table`.`id`,NULL)))=0)and((`type`.`living_settlement`=0)or(not(isnull(`livingpayment`.`id`)))),1,0) as `living_state`, IF((`zy_final_site_control`.`budget`!=0)and(count(distinct(IF(`table`.`state`<2,`table`.`id`,NULL)))=0)and((`type`.`settle_change`=0)or(`site`.`change_state`=1))and((`type`.`settlement`=0)or(not(isnull(`settlepayment`.`id`))))and(count(distinct(IF(`table`.`type`=0,`table`.`id`,NULL)))=0),1,0) as `settle_state`, count(`zy_final_site_control`.`id`) as `manager_count` from `zy_final_site_control` left join `zy_final_type` as `type` on `type`.`id` = `zy_final_site_control`.`type_id` left join `zy_final_site` as `site` on `site`.`id` = `zy_final_site_control`.`site_id` left join `zy_final_site_table` as `table` on `table`.`type_id` = `zy_final_site_control`.`type_id` and `table`.`site_id` = `zy_final_site_control`.`site_id` and `table`.`state` != -1 and `table`.`deleted_at` = 0 left join `zy_final_site_payment` as `livingpayment` on `livingpayment`.`type_id` = `type`.`living_settlement` and `livingpayment`.`site_id` = `zy_final_site_control`.`site_id` and `livingpayment`.`state` = 1 and `livingpayment`.`deleted_at` = 0 left join `zy_final_site_payment` as `settlepayment` on `settlepayment`.`type_id` = `type`.`settlement` and `settlepayment`.`site_id` = `zy_final_site_control`.`site_id` and `settlepayment`.`state` = 1 and `settlepayment`.`deleted_at` = 0 and `zy_final_site_control`.`deleted_at` = 0 group by `zy_final_site_control`.`id`) as `control` where `living_state` = 1 or `settle_state` = 1 group by `site_id`)"
  558. }
  559. type JoinStatistTable struct {
  560. db.BaseModel
  561. }
  562. func (JoinStatistTable) TableName() string {
  563. return "(select `zy_final_site_table`.`id`,`zy_final_site_table`.`site_id`, group_concat(concat(`type`.`name`, if(`zy_final_site_table`.`type` = 1,\"生活费\", \"结算\"))) as `name`, sum(if(`zy_final_site_table`.`state` = 0, 1, 0)) as `manager_count`, sum(if(`zy_final_site_table`.`state` = 1, 1, 0)) as `leader_count`, sum(if(`zy_final_site_table`.`state` = 2 or `zy_final_site_table`.`state` = 4, 1, 0)) as `finance_count`, sum(if(`zy_final_site_table`.`state` = 3, 1, 0)) as `shopowner_count`, sum(if(`zy_final_site_table`.`state` = 2, 1, 0)) as `incomplete_collect_count` from `zy_final_site_table` left join `zy_final_type` as `type` on `type`.`id` = `zy_final_site_table`.`type_id` where `zy_final_site_table`.`state` != 5 and `zy_final_site_table`.`state` != -1 and `zy_final_site_table`.`deleted_at` = 0 group by `zy_final_site_table`.`site_id`)"
  564. }
  565. type JoinStatistMaterial struct {
  566. db.BaseModel
  567. }
  568. func (JoinStatistMaterial) TableName() string {
  569. return "(select `zy_final_material`.`id`,`zy_final_material`.`site_id`, group_concat(`finalmatauxiliary`.`name`) as `name`, count(`zy_final_material`.`id`) as `manager_count` from `zy_final_material` left join `zy_final_mat_auxiliary` as `finalmatauxiliary` on `finalmatauxiliary`.`id` = `zy_final_material`.`type_id` where `zy_final_material`.`budget` != 0 and `zy_final_material`.`state` = 0 and `zy_final_material`.`deleted_at` = 0 group by `zy_final_material`.`site_id`)"
  570. }
  571. type JoinStatistOrder struct {
  572. db.BaseModel
  573. }
  574. func (JoinStatistOrder) TableName() string {
  575. return "(select `zy_final_material_order`.`id`,`zy_final_material_order`.`site_id`, group_concat(concat(`supplier`.`name`, \" \", `zy_final_material_order`.`order_no`)) as `name`, sum(if((`zy_final_material_order`.`state` in (9,0,2,5,11) and `zy_final_material_order`.`process_id` = 0) OR (`process`.`type` = 6 AND `process`.`check_at3` = 0), 1, 0)) as `supplier_count`, sum(if((`zy_final_material_order`.`state` in (8,1,3,4,6) and `zy_final_material_order`.`process_id` = 0) OR (`process`.`type` = 6 AND `process`.`check_at2` = 0) OR (`process`.`type` = 14 AND `process`.`check_at` = 0) OR (`process`.`type` = 7 AND `process`.`check_at2` = 0 AND `zy_final_material_order`.`created_id` = `finalsite`.`manager_id`), 1, 0)) as `manager_count`, sum(if(`zy_final_material_order`.`state` = 7 and `zy_final_material_order`.`process_id` = 0, 1, 0)) as `leader_count`, sum(if(`process`.`type` = 7 AND `process`.`check_at2` = 0 AND `zy_final_material_order`.`created_id` != `finalsite`.`manager_id`, 1, 0)) as `place_count`, sum(if((`process`.`type` = 7 AND `process`.`check_at` = 0) OR (`process`.`type` = 12 AND `process`.`check_at` = 0), 1, 0)) as `audit_count` from `zy_final_material_order` left join `zy_final_supplier` as `supplier` on `supplier`.`id` = `zy_final_material_order`.`supplier_id` left join `zy_final_material_order_process` as `process` on `process`.`id` = `zy_final_material_order`.`process_id` left join `zy_final_site` as `finalsite` on `finalsite`.`id` = `zy_final_material_order`.`site_id` where `zy_final_material_order`.`state` != 7 and `zy_final_material_order`.`state` != 11 and `zy_final_material_order`.`state` != 12 and `zy_final_material_order`.`state` != -1 and `zy_final_material_order`.`deleted_at` = 0 group by `zy_final_material_order`.`site_id`)"
  576. }
  577. type JoinStatistOrderAll struct {
  578. db.BaseModel
  579. }
  580. func (JoinStatistOrderAll) TableName() string {
  581. return "(select `zy_final_material_order`.`id`,`zy_final_material_order`.`site_id`, sum(if(`settle`.`state` = 2, 1, 0)) as `incomplete_collect_count`, sum(if(`zy_final_material_order`.`state` = 0, 1, 0)) as `state0_count`, sum(if(`zy_final_material_order`.`state` = 1, 1, 0)) as `state1_count`, sum(if(`zy_final_material_order`.`state` = 2, 1, 0)) as `state2_count`, sum(if(`zy_final_material_order`.`state` = 3, 1, 0)) as `state3_count`, sum(if(`zy_final_material_order`.`state` = 4, 1, 0)) as `state4_count`, sum(if(`zy_final_material_order`.`state` = 5, 1, 0)) as `state5_count`, sum(if(`zy_final_material_order`.`state` = 6, 1, 0)) as `state6_count`, sum(if(`zy_final_material_order`.`state` = 7, 1, 0)) as `state7_count`, sum(if(`zy_final_material_order`.`state` = 8, 1, 0)) as `state8_count`, sum(if(`zy_final_material_order`.`state` = 9, 1, 0)) as `state9_count`, sum(if(`zy_final_material_order`.`state` = 10, 1, 0)) as `state10_count`, sum(if(`zy_final_material_order`.`state` = 11, 1, 0)) as `state11_count`, sum(if(`zy_final_material_order`.`state` = 12, 1, 0)) as `state12_count` from `zy_final_material_order` left join `zy_final_material_settle` as `settle` on `settle`.`id` = `zy_final_material_order`.`settle_id` and `settle`.`deleted_at` = 0 where `zy_final_material_order`.`deleted_at` = 0 group by `zy_final_material_order`.`site_id`)"
  582. }
  583. type JoinStatistPayment struct {
  584. db.BaseModel
  585. }
  586. func (JoinStatistPayment) TableName() string {
  587. return "(select `zy_final_site_payment`.`id`,`zy_final_site_payment`.`site_id`, group_concat(`type`.`name`) as `name`, count(`zy_final_site_payment`.`id`) as `finance_count` from `zy_final_site_payment` left join `zy_final_payment_type` as `type` on `type`.`id` = `zy_final_site_payment`.`type_id` where `zy_final_site_payment`.`state` = 0 and `zy_final_site_payment`.`deleted_at` = 0 group by `zy_final_site_payment`.`site_id`)"
  588. }
  589. type JoinStatistSettle struct {
  590. db.BaseModel
  591. }
  592. func (JoinStatistSettle) TableName() string {
  593. return "(select `id`,`site_id`, `state`, `manager_price`, `worker_price`, `auxiliary_price`, `subsidy_price`, `total`, sum(if(`zy_final_settle`.`state` in (0,2), 1, 0)) as `manager_count`, sum(if(`zy_final_settle`.`state` = 1, 1, 0)) as `customer_count`, sum(if(`zy_final_settle`.`state` in (3,5), 1, 0)) as `finance_count`, sum(if(`zy_final_settle`.`state` = 4, 1, 0)) as `shopowner_count` from `zy_final_settle` where `state` != 0 and `deleted_at` = 0 group by `site_id`)"
  594. }
  595. type FinalSiteStatist struct {
  596. WriteControl int64 `json:"write_control" type:"int" prop:"select:if(isnull(price.id),1,0)" search:"="` //由原來的wirte改成price
  597. ApplyControl int64 `json:"apply_control" type:"int" prop:"select:if(isnull(apply.id),0,1)" search:"="`
  598. ApplyControlName string `json:"apply_control_name" type:"string" prop:"select:apply.name" search:"="`
  599. IncompleteTable int64 `json:"incomplete_table" type:"int" prop:"select:if(isnull(table.id),0,1)" search:"="`
  600. IncompleteTableName string `json:"incomplete_table_name" type:"string" prop:"select:table.name" search:"="`
  601. NoOrder int64 `json:"no_order" type:"int" prop:"select:if(isnull(material.id),0,1)" search:"="`
  602. NoOrderName string `json:"no_order_name" type:"string" prop:"select:material.name" search:"="`
  603. IncompleteOrder int64 `json:"incomplete_order" type:"int" prop:"select:if(isnull(order.id),0,1)" search:"="`
  604. IncompleteOrderName string `json:"incomplete_order_name" type:"string" prop:"select:order.name" search:"="`
  605. IncompletePayment int64 `json:"incomplete_payment" type:"int" prop:"select:if(isnull(payment.id),0,1)" search:"="`
  606. IncompletePaymentName string `json:"incomplete_payment_name" type:"string" prop:"select:payment.name" search:"="`
  607. IncompleteChange int64 `json:"incomplete_change" type:"int" prop:"select:if(zy_final_site.change_state=1,0,1)" search:"="`
  608. Total float64 `json:"total" label:"金额" type:"float" prop:"select:settle.total"`
  609. ManagerPrice float64 `json:"manager_price" label:"承包额" type:"float" prop:"select:settle.manager_price"`
  610. WorkerPrice float64 `json:"worker_price" label:"工人" type:"float" prop:"select:settle.worker_price"`
  611. AuxiliaryPrice float64 `json:"auxiliary_price" label:"辅材" type:"float" prop:"select:settle.auxiliary_price"`
  612. SubsidyPrice float64 `json:"subsidy_price" label:"补贴" type:"float" prop:"select:settle.subsidy_price"`
  613. SettleState int64 `json:"settle_state" label:"状态" type:"int" prop:"select:ifnull(settle.state,0)" search:"="`
  614. AreaName string `json:"area_name" type:"string" prop:"select:area.name" search:"="`
  615. ShopName string `json:"shop_name" type:"string" prop:"select:shop.shop_name"`
  616. DeptName string `json:"dept_name" prop:"select:dept.name"`
  617. ManagerName string `json:"manager_name" type:"string" prop:"select:manager.username"`
  618. ManagerPhone string `json:"manager_phone" type:"string" prop:"select:manager.phone"`
  619. ProjectLeaderName string `json:"project_leader_name" type:"string" prop:"select:project_leader.username"`
  620. ProjectLeaderPhone string `json:"project_leader_phone" type:"string" prop:"select:project_leader.phone"`
  621. DesignerName string `json:"designer_name" type:"string" prop:"select:designer.username"`
  622. DesignerPhone string `json:"designer_phone" type:"string" prop:"select:designer.phone"`
  623. SalesmanName string `json:"salesman_name" type:"string" prop:"select:salesman.username"`
  624. SalesmanPhone string `json:"salesman_phone" type:"string" prop:"select:salesman.phone"`
  625. PkgName string `json:"pkg_name" type:"string" prop:"select:pkg.name"`
  626. ManagerCount int64 `json:"manager_count" type:"int" prop:"select:if(isnull(apply.manager_count),0,apply.manager_count)+if(isnull(table.manager_count),0,table.manager_count)+if(isnull(material.manager_count),0,material.manager_count)+if(isnull(order.manager_count),0,order.manager_count)+if(isnull(material.manager_count),0,material.manager_count)+if(isnull(settle.manager_count),0,settle.manager_count)" search:"="`
  627. LeaderCount int64 `json:"leader_count" type:"int" prop:"select:if(isnull(table.leader_count),0,table.leader_count)+if(isnull(order.leader_count),0,order.leader_count)" search:"="`
  628. FinanceCount int64 `json:"finance_count" type:"int" prop:"select:if(isnull(table.finance_count),0,table.finance_count)+if(isnull(payment.finance_count),0,payment.finance_count)+if(isnull(settle.finance_count),0,settle.finance_count)" search:"="`
  629. AuditCount int64 `json:"audit_count" type:"int" prop:"select:if(isnull(order.audit_count),0,order.audit_count)+if(isnull(write.id),1,0)+if(zy_final_site.change_state=1,0,1)" search:"="`
  630. ShopownerCount int64 `json:"shopowner_count" type:"int" prop:"select:if(isnull(table.shopowner_count),0,table.shopowner_count)+if(isnull(settle.shopowner_count),0,settle.shopowner_count)" search:"="`
  631. CustomerCount int64 `json:"customer_count" type:"int" prop:"select:if(isnull(settle.customer_count),0,settle.customer_count)" search:"="`
  632. PlaceCount int64 `json:"place_count" type:"int" prop:"select:if(isnull(order.place_count),0,order.place_count)" search:"="`
  633. SupplierCount int64 `json:"supplier_count" type:"int" prop:"select:if(isnull(order.supplier_count),0,order.supplier_count)" search:"="`
  634. TableIncompleteCollectCount int64 `json:"table_incomplete_collect_count" type:"int" prop:"select:if(isnull(table.incomplete_collect_count),0,table.incomplete_collect_count)" search:"="`
  635. OrderIncompleteCollectCount int64 `json:"order_incomplete_collect_count" type:"int" prop:"select:if(isnull(orderall.incomplete_collect_count),0,orderall.incomplete_collect_count)" search:"="`
  636. OrderState0Count int64 `json:"order_state0_count" type:"int" prop:"select:if(isnull(orderall.state0_count),0,orderall.state0_count)" search:"="`
  637. OrderState1Count int64 `json:"order_state1_count" type:"int" prop:"select:if(isnull(orderall.state1_count),0,orderall.state1_count)" search:"="`
  638. OrderState2Count int64 `json:"order_state2_count" type:"int" prop:"select:if(isnull(orderall.state2_count),0,orderall.state2_count)" search:"="`
  639. OrderState3Count int64 `json:"order_state3_count" type:"int" prop:"select:if(isnull(orderall.state3_count),0,orderall.state3_count)" search:"="`
  640. OrderState4Count int64 `json:"order_state4_count" type:"int" prop:"select:if(isnull(orderall.state4_count),0,orderall.state4_count)" search:"="`
  641. OrderState5Count int64 `json:"order_state5_count" type:"int" prop:"select:if(isnull(orderall.state5_count),0,orderall.state5_count)" search:"="`
  642. OrderState6Count int64 `json:"order_state6_count" type:"int" prop:"select:if(isnull(orderall.state6_count),0,orderall.state6_count)" search:"="`
  643. OrderState7Count int64 `json:"order_state7_count" type:"int" prop:"select:if(isnull(orderall.state7_count),0,orderall.state7_count)" search:"="`
  644. OrderState8Count int64 `json:"order_state8_count" type:"int" prop:"select:if(isnull(orderall.state8_count),0,orderall.state8_count)" search:"="`
  645. OrderState9Count int64 `json:"order_state9_count" type:"int" prop:"select:if(isnull(orderall.state9_count),0,orderall.state9_count)" search:"="`
  646. OrderState10Count int64 `json:"order_state10_count" type:"int" prop:"select:if(isnull(orderall.state10_count),0,orderall.state10_count)" search:"="`
  647. OrderState11Count int64 `json:"order_state11_count" type:"int" prop:"select:if(isnull(orderall.state11_count),0,orderall.state11_count)" search:"="`
  648. OrderState12Count int64 `json:"order_state12_count" type:"int" prop:"select:if(isnull(orderall.state12_count),0,orderall.state12_count)" search:"="`
  649. FinalSite
  650. }
  651. func (model FinalSiteStatist) GroupBy() string {
  652. return ""
  653. }
  654. func (model FinalSiteStatist) ExportFields() []db.ExportField {
  655. return []db.ExportField{
  656. {
  657. Label: "ID",
  658. Name: "id",
  659. Width: 10,
  660. },
  661. {
  662. Label: "业主姓名",
  663. Name: "username",
  664. Width: 10,
  665. },
  666. {
  667. Label: "手机号码",
  668. Name: "phone",
  669. Width: 20,
  670. },
  671. {
  672. Label: "区域",
  673. Name: "area_name",
  674. Width: 10,
  675. },
  676. {
  677. Label: "工地",
  678. Name: "address",
  679. Width: 30,
  680. },
  681. {
  682. Label: "户型",
  683. Name: "room",
  684. Width: 30,
  685. },
  686. {
  687. Label: "门店",
  688. Name: "shop_name",
  689. Width: 15,
  690. },
  691. {
  692. Label: "部门",
  693. Name: "dept_name",
  694. Width: 15,
  695. },
  696. {
  697. Label: "设计师",
  698. Name: "designer_name",
  699. Width: 10,
  700. },
  701. {
  702. Label: "业务员",
  703. Name: "salesman_name",
  704. Width: 10,
  705. },
  706. {
  707. Label: "项目经理",
  708. Name: "manager_name",
  709. Width: 10,
  710. },
  711. {
  712. Label: "工程队长",
  713. Name: "project_leader_name",
  714. Width: 10,
  715. },
  716. {
  717. Label: "开工日期",
  718. Name: "starttime",
  719. Width: 20,
  720. },
  721. {
  722. Label: "完工日期",
  723. Name: "endtime",
  724. Width: 15,
  725. },
  726. {
  727. Label: "套餐",
  728. Name: "pkg_name",
  729. Width: 20,
  730. },
  731. {
  732. Label: "控额",
  733. Name: "write_control",
  734. Width: 10,
  735. },
  736. {
  737. Label: "工人申请",
  738. Name: "apply_control",
  739. Width: 10,
  740. },
  741. {
  742. Label: "工人项目",
  743. Name: "incomplete_table",
  744. Width: 10,
  745. },
  746. {
  747. Label: "辅材下单",
  748. Name: "no_order",
  749. Width: 10,
  750. },
  751. {
  752. Label: "材料订单",
  753. Name: "incomplete_order",
  754. Width: 10,
  755. },
  756. {
  757. Label: "结款",
  758. Name: "incomplete_payment",
  759. Width: 10,
  760. },
  761. {
  762. Label: "变更",
  763. Name: "incomplete_change",
  764. Width: 10,
  765. },
  766. {
  767. Label: "未申请工人项目",
  768. Name: "apply_control_name",
  769. Width: 20,
  770. },
  771. {
  772. Label: "未完成工人项目",
  773. Name: "incomplete_table_name",
  774. Width: 20,
  775. },
  776. {
  777. Label: "未下单辅材",
  778. Name: "no_order_name",
  779. Width: 20,
  780. },
  781. {
  782. Label: "未完成订单",
  783. Name: "incomplete_order_name",
  784. Width: 20,
  785. },
  786. {
  787. Label: "未完成结款",
  788. Name: "incomplete_payment_name",
  789. Width: 20,
  790. },
  791. {
  792. Label: "结算金额",
  793. Name: "settle_total",
  794. Width: 20,
  795. },
  796. {
  797. Label: "结算状态",
  798. Name: "settle_state",
  799. Width: 20,
  800. },
  801. {
  802. Label: "项目经理未完成",
  803. Name: "manager_count",
  804. Width: 20,
  805. },
  806. {
  807. Label: "工程队长未完成",
  808. Name: "leader_count",
  809. Width: 20,
  810. },
  811. {
  812. Label: "财务未完成",
  813. Name: "finance_count",
  814. Width: 20,
  815. },
  816. {
  817. Label: "成控未完成",
  818. Name: "audit_count",
  819. Width: 20,
  820. },
  821. {
  822. Label: "店长未完成",
  823. Name: "shopowner_count",
  824. Width: 20,
  825. },
  826. {
  827. Label: "客服未完成",
  828. Name: "customer_count",
  829. Width: 20,
  830. },
  831. {
  832. Label: "下单员未完成",
  833. Name: "place_count",
  834. Width: 20,
  835. },
  836. {
  837. Label: "材料商未完成",
  838. Name: "supplier_count",
  839. Width: 20,
  840. },
  841. {
  842. Label: "工人待汇总",
  843. Name: "table_incomplete_collect_count",
  844. Width: 20,
  845. },
  846. {
  847. Label: "材料待汇总",
  848. Name: "order_incomplete_collect_count",
  849. Width: 20,
  850. },
  851. {
  852. Label: "材料待备货",
  853. Name: "order_state0_count",
  854. Width: 20,
  855. },
  856. {
  857. Label: "材料已备货",
  858. Name: "order_state1_count",
  859. Width: 20,
  860. },
  861. {
  862. Label: "材料待配送",
  863. Name: "order_state2_count",
  864. Width: 20,
  865. },
  866. {
  867. Label: "材料待收货",
  868. Name: "order_state3_count",
  869. Width: 20,
  870. },
  871. {
  872. Label: "材料已收货",
  873. Name: "order_state4_count",
  874. Width: 20,
  875. },
  876. {
  877. Label: "材料待安装",
  878. Name: "order_state5_count",
  879. Width: 20,
  880. },
  881. {
  882. Label: "材料待验收",
  883. Name: "order_state6_count",
  884. Width: 20,
  885. },
  886. {
  887. Label: "材料已完成",
  888. Name: "order_state7_count",
  889. Width: 20,
  890. },
  891. {
  892. Label: "材料已下单",
  893. Name: "order_state8_count",
  894. Width: 20,
  895. },
  896. {
  897. Label: "材料待测量",
  898. Name: "order_state9_count",
  899. Width: 20,
  900. },
  901. {
  902. Label: "材料待审核",
  903. Name: "order_state10_count",
  904. Width: 20,
  905. },
  906. {
  907. Label: "材料待结算",
  908. Name: "order_state11_count",
  909. Width: 20,
  910. },
  911. {
  912. Label: "材料已结算",
  913. Name: "order_state12_count",
  914. Width: 20,
  915. },
  916. }
  917. }
  918. func (FinalSiteStatist) ExportValue(row map[string]interface{}, rowIndex int, field db.ExportField, data []map[string]interface{}) string {
  919. switch field.Name {
  920. case "address":
  921. worksite := /*db.ToString(v["address"]) + " " +*/ db.ToString(row["village"]) + "" + db.ToString(row["room_no"])
  922. if worksite == "" {
  923. worksite = db.ToString(row["address"])
  924. }
  925. if db.ToString(row["area"]) != "" {
  926. worksite += " " + db.ToString(row["area"]) + "㎡"
  927. }
  928. return worksite
  929. case "room":
  930. return db.ToString(row["room_1"]) + "室 " + db.ToString(row["room_2"]) + "厅 " + db.ToString(row["room_3"]) + "厨 " + db.ToString(row["room_4"]) + "卫 " + db.ToString(row["room_5"]) + "阳台"
  931. case "starttime":
  932. starttime, _ := db.ToInt64(row["starttime"])
  933. if starttime == 0 {
  934. return ""
  935. }
  936. t := time.Unix(starttime, 0).Local()
  937. return t.Format("2006-01-02 15:04")
  938. case "endtime":
  939. endtime, _ := db.ToInt64(row["endtime"])
  940. if endtime == 0 {
  941. return ""
  942. }
  943. t := time.Unix(endtime, 0).Local()
  944. return t.Format("2006-01-02")
  945. case "write_control":
  946. write_control, _ := db.ToInt64(row["write_control"])
  947. if write_control == 1 {
  948. return "未完成"
  949. }
  950. return "已完成"
  951. case "apply_control":
  952. apply_control, _ := db.ToInt64(row["apply_control"])
  953. if apply_control == 1 {
  954. return "未完成"
  955. }
  956. return "已完成"
  957. case "incomplete_table":
  958. incomplete_table, _ := db.ToInt64(row["incomplete_table"])
  959. if incomplete_table == 1 {
  960. return "未完成"
  961. }
  962. return "已完成"
  963. case "no_order":
  964. no_order, _ := db.ToInt64(row["no_order"])
  965. if no_order == 1 {
  966. return "未完成"
  967. }
  968. return "已完成"
  969. case "incomplete_order":
  970. incomplete_order, _ := db.ToInt64(row["incomplete_order"])
  971. if incomplete_order == 1 {
  972. return "未完成"
  973. }
  974. return "已完成"
  975. case "incomplete_payment":
  976. incomplete_payment, _ := db.ToInt64(row["incomplete_payment"])
  977. if incomplete_payment == 1 {
  978. return "未完成"
  979. }
  980. return "已完成"
  981. case "incomplete_change":
  982. incomplete_change, _ := db.ToInt64(row["incomplete_change"])
  983. if incomplete_change == 1 {
  984. return "未完成"
  985. }
  986. return "已完成"
  987. case "settle_total":
  988. settle_total := ""
  989. manager_price, _ := db.ToFloat64(row["manager_price"])
  990. if manager_price != 0 {
  991. settle_total += "承包额:" + db.ToString(manager_price) + "\n"
  992. }
  993. worker_price, _ := db.ToFloat64(row["worker_price"])
  994. if worker_price != 0 {
  995. settle_total += "工人:" + db.ToString(worker_price) + "\n"
  996. }
  997. auxiliary_price, _ := db.ToFloat64(row["auxiliary_price"])
  998. if auxiliary_price != 0 {
  999. settle_total += "辅材:" + db.ToString(auxiliary_price) + "\n"
  1000. }
  1001. subsidy_price, _ := db.ToFloat64(row["subsidy_price"])
  1002. if subsidy_price != 0 {
  1003. settle_total += "补贴:" + db.ToString(subsidy_price) + "\n"
  1004. }
  1005. total, _ := db.ToFloat64(row["total"])
  1006. if total != 0 {
  1007. settle_total += "金额:" + db.ToString(total) + "\n"
  1008. }
  1009. return settle_total
  1010. case "settle_state":
  1011. settle_state, _ := db.ToInt64(row["settle_state"])
  1012. switch settle_state {
  1013. case 0:
  1014. return "未发起"
  1015. case 1:
  1016. return "客服回访"
  1017. case 2:
  1018. return "项目经理确认"
  1019. case 3:
  1020. return "财务审核"
  1021. case 4:
  1022. return "店长审核"
  1023. case 5:
  1024. return "财务付款"
  1025. case 6:
  1026. return "已完成"
  1027. }
  1028. return ""
  1029. }
  1030. return db.ToString(row[field.Name])
  1031. }
  1032. func (model FinalSiteStatist) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel {
  1033. return []db.JoinModel{
  1034. {
  1035. Model: FinalArea{},
  1036. As: "area",
  1037. On: []string{"`area`.`id` = " + model.TableName() + ".`area_id`"},
  1038. },
  1039. {
  1040. Model: JoinShop{},
  1041. As: "shop",
  1042. On: []string{"`shop`.`id` = " + model.TableName() + ".`shop_id`"},
  1043. },
  1044. {
  1045. Model: JoinDept{},
  1046. As: "dept",
  1047. On: []string{"`dept`.`id` = " + model.TableName() + ".`dept_id`"},
  1048. }, {
  1049. Model: JoinAdmin{},
  1050. As: "manager",
  1051. On: []string{"`manager`.`id` = " + model.TableName() + ".`manager_id`"},
  1052. }, {
  1053. Model: JoinAdmin{},
  1054. As: "project_leader",
  1055. On: []string{"`project_leader`.`id` = " + model.TableName() + ".`project_leader_id`"},
  1056. },
  1057. {
  1058. Model: JoinAdmin{},
  1059. As: "designer",
  1060. On: []string{"`designer`.`id` = " + model.TableName() + ".`designer_id`"},
  1061. },
  1062. {
  1063. Model: JoinAdmin{},
  1064. As: "salesman",
  1065. On: []string{"`salesman`.`id` = " + model.TableName() + ".`salesman_id`"},
  1066. },
  1067. {
  1068. Model: FinalPkg{},
  1069. As: "pkg",
  1070. On: []string{"`pkg`.`id` = " + model.TableName() + ".`pkg_id`"},
  1071. },
  1072. {
  1073. Model: JoinWriteControl{},
  1074. As: "write",
  1075. On: []string{"`write`.`site_id` = " + model.TableName() + ".`id`"},
  1076. },
  1077. {
  1078. Model: JoinPriceControl{},
  1079. As: "price",
  1080. On: []string{"`price`.`site_id` = " + model.TableName() + ".`id`"},
  1081. },
  1082. {
  1083. Model: JoinApplyControl{},
  1084. As: "apply",
  1085. On: []string{"`apply`.`site_id` = " + model.TableName() + ".`id`"},
  1086. },
  1087. {
  1088. Model: JoinStatistTable{},
  1089. As: "table",
  1090. On: []string{"`table`.`site_id` = " + model.TableName() + ".`id`"},
  1091. },
  1092. {
  1093. Model: JoinStatistMaterial{},
  1094. As: "material",
  1095. On: []string{"`material`.`site_id` = " + model.TableName() + ".`id`"},
  1096. },
  1097. {
  1098. Model: JoinStatistOrder{},
  1099. As: "order",
  1100. On: []string{"`order`.`site_id` = " + model.TableName() + ".`id`"},
  1101. },
  1102. {
  1103. Model: JoinStatistOrderAll{},
  1104. As: "orderall",
  1105. On: []string{"`orderall`.`site_id` = " + model.TableName() + ".`id`"},
  1106. },
  1107. {
  1108. Model: JoinStatistPayment{},
  1109. As: "payment",
  1110. On: []string{"`payment`.`site_id` = " + model.TableName() + ".`id`"},
  1111. },
  1112. {
  1113. Model: JoinStatistSettle{},
  1114. As: "settle",
  1115. On: []string{"`settle`.`site_id` = " + model.TableName() + ".`id`"},
  1116. },
  1117. }
  1118. }