final_site_amount.go 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770
  1. package final
  2. import (
  3. "errors"
  4. "fmt"
  5. "math"
  6. "time"
  7. "zhiyuan/models"
  8. "zhiyuan/pkg/db"
  9. "zhiyuan/pkg/logger"
  10. "zhiyuan/pkg/utils"
  11. "zhiyuan/services/admin"
  12. "github.com/Knetic/govaluate"
  13. "github.com/gin-gonic/gin"
  14. )
  15. type FinalSiteAmount struct {
  16. ID int64 `json:"id" prop:"add:false"`
  17. SiteId int64 `json:"site_id" label:"套餐" type:"int" prop:"add edit" search:"="`
  18. Content string `json:"content" label:"内容" type:"string" prop:"edit"`
  19. ContractTotal float64 `json:"contract_total" label:"合同总金额" type:"float" prop:"add:false select:zy_final_site_amount.contract_total+sum(if(isnull(change.id),0,if(change.type2=2,-change.amount,change.amount)))"`
  20. Performance float64 `json:"performance" label:"业绩" type:"float" prop:"add:false"`
  21. Purchase float64 `json:"purchase" label:"代购" type:"float" prop:"add:false"`
  22. Custom float64 `json:"custom" label:"定制" type:"float" prop:"add:false"`
  23. PersonalCollect float64 `json:"personal_collect" label:"个性化汇总" type:"float" prop:"add:false"`
  24. PersonalMaterial float64 `json:"personal_material" label:"个性化材料" type:"float" prop:"add:false"`
  25. PersonalCustom float64 `json:"personal_custom" label:"个性化定制" type:"float" prop:"add:false"`
  26. SpecialItem float64 `json:"special_item" label:"特殊项目代购" type:"float" prop:"add:false"`
  27. DesignFree float64 `json:"design_free" label:"设计费" type:"float" prop:"add:false"`
  28. StartTime int64 `json:"starttime" label:"开工日期" type:"int" prop:"edit"`
  29. Duration int64 `json:"duration" label:"工期" type:"int" prop:"edit"`
  30. EndTime int64 `json:"endtime" label:"完工日期" type:"int" prop:"add:false" search:"="`
  31. Files string `json:"files" label:"文件上传" type:"string" prop:"edit"`
  32. CreatedId int64 `json:"created_id" label:"创建人员" type:"int" prop:"add:false" search:"="`
  33. DeletedAt int64 `json:"deleted_at" prop:"add:false select:false"`
  34. CreatedAt int64 `json:"created_at" prop:"add:false"`
  35. UpdatedAt int64 `json:"updated_at" prop:"add:false"`
  36. db.BaseModel
  37. }
  38. func (FinalSiteAmount) TableName() string {
  39. return "zy_final_site_amount"
  40. }
  41. func (model FinalSiteAmount) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool {
  42. return true
  43. }
  44. func (FinalSiteAmount) AddPrivilege(c *gin.Context, data map[string]interface{}, post map[string]interface{}) error {
  45. site_id, _ := db.ToInt64(data["site_id"])
  46. var site FinalSite
  47. db.GetModel(map[string]interface{}{
  48. "id": site_id,
  49. "deleted_at": 0,
  50. }, &site)
  51. if site.ID == 0 {
  52. return errors.New("没有权限")
  53. }
  54. from := make(map[string]float64)
  55. var fields []FinalPkgField
  56. db.GetModel(map[string]interface{}{"pkg_id": site.PkgId}, &fields)
  57. for _, v := range fields {
  58. value, _ := db.ToFloat64(v.Value)
  59. from[v.Name] = value
  60. }
  61. data["content"] = utils.JsonEncode(from)
  62. data["contract_total"] = 0
  63. data["performance"] = 0
  64. data["created_id"] = c.GetInt("adminID")
  65. return nil
  66. }
  67. func (FinalSiteAmount) EditPrivilege(c *gin.Context, id int64, data map[string]interface{}, post map[string]interface{}) error {
  68. var model FinalSiteAmount
  69. db.GetModel(map[string]interface{}{
  70. "id": id,
  71. "deleted_at": 0,
  72. }, &model)
  73. var site FinalSite
  74. db.GetModel(map[string]interface{}{
  75. "id": model.SiteId,
  76. "deleted_at": 0,
  77. }, &site)
  78. if !admin.CheckShop(int(site.ShopId), c.GetInt("adminID")) {
  79. return errors.New("没有权限")
  80. }
  81. if site.State == 1 {
  82. return errors.New("工地已开工")
  83. }
  84. /*project_direct_discount, _ := db.ToFloat64(data["project_direct_discount"])
  85. project_direct, _ := db.ToFloat64(data["project_direct"])
  86. quotation_discount := utils.FloatDiv(project_direct_discount, project_direct, 2)
  87. data["quotation_discount"] = quotation_discount
  88. material_purchase_total, _ := db.ToFloat64(data["material_purchase_total"])
  89. special_total, _ := db.ToFloat64(data["special_total"])
  90. taxes, _ := db.ToFloat64(data["taxes"])
  91. quotation_total := utils.FloatAddSlice([]float64{project_direct_discount, material_purchase_total, special_total, taxes}, 2)
  92. data["quotation_total"] = quotation_total
  93. contract_total, _ := db.ToFloat64(data["contract_total"])
  94. preferential_total := utils.FloatSub(quotation_total, contract_total, 2)
  95. data["preferential_total"] = preferential_total
  96. var site FinalSite
  97. db.GetModel(map[string]interface{}{
  98. "id": model.SiteId,
  99. "deleted_at": 0,
  100. }, &site)
  101. var pkg FinalPkg
  102. db.GetModel(map[string]interface{}{
  103. "id": site.PkgId,
  104. "deleted_at": 0,
  105. }, &pkg)
  106. design, _ := db.ToFloat64(data["design"])
  107. draw, _ := db.ToFloat64(data["draw"])
  108. must_draw := utils.FloatMul(pkg.Design, site.Area, 2)
  109. design_grant := utils.FloatMul(utils.FloatSub(utils.FloatAdd(design, draw, 2), must_draw, 2), quotation_discount, 2)
  110. design_grant = utils.FloatSub(design_grant, preferential_total, 2)
  111. if pkg.Discount > quotation_discount {
  112. diff := utils.FloatMul(project_direct, utils.FloatSub(pkg.Discount, quotation_discount, 2), 2)
  113. design_grant = utils.FloatAdd(design_grant, diff, 2)
  114. }
  115. data["design_grant"] = design_grant
  116. db.InsertModel(db.Type(FinalSiteAmountRecord{}), map[string]interface{}{
  117. "site_id": model.SiteId,
  118. "deposit": data["deposit"],
  119. "package": data["package"],
  120. "personal_total": data["personal_total"],
  121. "personal_material": data["personal_material"],
  122. "personal_custom": data["personal_custom"],
  123. "personal_build": data["personal_build"],
  124. "draw": data["draw"],
  125. "design": data["design"],
  126. "project_direct": data["project_direct"],
  127. "project_direct_discount": data["project_direct_discount"],
  128. "quotation_discount": data["quotation_discount"],
  129. "material_purchase_total": data["material_purchase_total"],
  130. "purchase": data["purchase"],
  131. "upgrade": data["upgrade"],
  132. "special_total": data["special_total"],
  133. "taxes": data["taxes"],
  134. "deduction": data["deduction"],
  135. "quotation_total": data["quotation_total"],
  136. "preferential_total": data["preferential_total"],
  137. "contract_total": data["contract_total"],
  138. "files": data["files"],
  139. "created_id": c.GetInt("adminID"),
  140. })*/
  141. starttime, _ := db.ToInt64(data["starttime"])
  142. duration, _ := db.ToInt64(data["duration"])
  143. if starttime == 0 {
  144. return errors.New("请输入开工时间")
  145. }
  146. if duration == 0 {
  147. return errors.New("请输入工期")
  148. }
  149. t := time.Unix(starttime, 0)
  150. t = t.AddDate(0, 0, int(duration)-1)
  151. endtime := t.Unix()
  152. err := db.UpdateModel(db.Type(site), site.ID, map[string]interface{}{
  153. "starttime": starttime,
  154. "endtime": endtime,
  155. })
  156. if err != nil {
  157. return err
  158. }
  159. from := utils.JsonDecode(db.ToString(data["content"])).ToMap()
  160. context, err := NewAmountContext(site, from)
  161. if err != nil {
  162. return err
  163. }
  164. contractTotal, performance, purchase, custom, personalCollect, personalMaterial, personalCustom, specialItem, designFree, err := context.Eval()
  165. if err != nil {
  166. return err
  167. }
  168. data["content"] = context.Save()
  169. data["contract_total"] = contractTotal
  170. data["performance"] = performance
  171. data["purchase"] = purchase
  172. data["custom"] = custom
  173. data["personal_collect"] = personalCollect
  174. data["personal_material"] = personalMaterial
  175. data["personal_custom"] = personalCustom
  176. data["special_item"] = specialItem
  177. data["design_free"] = designFree
  178. data["endtime"] = endtime
  179. db.InsertModel(db.Type(FinalSiteAmountRecord{}), map[string]interface{}{
  180. "site_id": model.SiteId,
  181. "content": data["content"],
  182. "contract_total": data["contract_total"],
  183. "performance": data["performance"],
  184. "purchase": data["purchase"],
  185. "custom": data["custom"],
  186. "personal_collect": data["personal_collect"],
  187. "personal_material": data["personal_material"],
  188. "personal_custom": data["personal_custom"],
  189. "special_item": data["special_item"],
  190. "design_free": data["design_free"],
  191. "starttime": data["starttime"],
  192. "duration": data["duration"],
  193. "endtime": data["endtime"],
  194. "files": data["files"],
  195. "created_id": c.GetInt("adminID"),
  196. })
  197. return nil
  198. }
  199. func (FinalSiteAmount) DelPrivilege(c *gin.Context, id int64) error {
  200. return nil
  201. }
  202. func (FinalSiteAmount) Page() bool {
  203. return false
  204. }
  205. func (FinalSiteAmount) Count() bool {
  206. return true
  207. }
  208. func (model FinalSiteAmount) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel {
  209. return []db.JoinModel{
  210. {
  211. Model: FinalSiteChange{},
  212. As: "change",
  213. On: []string{"`change`.`site_id` = " + model.TableName() + ".`site_id`"},
  214. },
  215. }
  216. }
  217. func (model FinalSiteAmount) GroupBy() string {
  218. return fmt.Sprintf("`%s`.`id`", model.TableName())
  219. }
  220. type FinalSiteAmountDesignerStatist struct {
  221. DesignerId int64 `json:"designer_id" label:"设计师" prop:"select:site.designer_id"`
  222. DesignerName string `json:"designer_name" prop:"select:designer.username" search:"like"`
  223. DesignerPhone string `json:"designer_phone" prop:"select:designer.phone"`
  224. ContractTotal float64 `json:"contract_total" label:"合同金额" type:"float" prop:"select:sum(zy_final_site_amount.contract_total)"`
  225. Performance float64 `json:"performance" label:"业绩" type:"float" prop:"select:sum(zy_final_site_amount.performance)"`
  226. Purchase float64 `json:"purchase" label:"代购" type:"float" prop:"select:sum(zy_final_site_amount.purchase)"`
  227. Custom float64 `json:"custom" label:"定制" type:"float" prop:"select:sum(zy_final_site_amount.custom)"`
  228. PersonalCollect float64 `json:"personal_collect" label:"个性化汇总" type:"float" prop:"select:sum(zy_final_site_amount.personal_collect)"`
  229. PersonalMaterial float64 `json:"personal_material" label:"个性化材料" type:"float" prop:"select:sum(zy_final_site_amount.personal_material)"`
  230. PersonalCustom float64 `json:"personal_custom" label:"个性化定制" type:"float" prop:"select:sum(zy_final_site_amount.personal_custom)"`
  231. SpecialItem float64 `json:"special_item" label:"特殊项目代购" type:"float" prop:"select:sum(zy_final_site_amount.special_item)"`
  232. DesignFree float64 `json:"design_free" label:"设计费" type:"float" prop:"select:sum(zy_final_site_amount.design_free)"`
  233. db.BaseModel
  234. }
  235. func (FinalSiteAmountDesignerStatist) TableName() string {
  236. return "zy_final_site_amount"
  237. }
  238. func (model FinalSiteAmountDesignerStatist) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool {
  239. if !admin.CheckAuth([]string{"final:finalsitecontract:performance"}, c.GetInt("adminID")) {
  240. adminID := s.Param(c.GetInt("adminID"))
  241. where := fmt.Sprintf("`site`.`designer_id` = %s", adminID)
  242. s.Where = append(s.Where, fmt.Sprintf("(%s)", where))
  243. }
  244. if signtime1s, ok := data["signtime1"]; ok {
  245. if signtime1, ok := db.ToInt64(signtime1s); ok {
  246. s.Where = append(s.Where, fmt.Sprintf("`site`.`signtime` >= %s", s.Param(signtime1)))
  247. }
  248. }
  249. if signtime2s, ok := data["signtime2"]; ok {
  250. if signtime2, ok := db.ToInt64(signtime2s); ok {
  251. s.Where = append(s.Where, fmt.Sprintf("`site`.`signtime` < %s", s.Param(signtime2+60*60*24)))
  252. }
  253. }
  254. return true
  255. }
  256. func (model FinalSiteAmountDesignerStatist) GroupBy() string {
  257. return "`site`.`designer_id`"
  258. }
  259. func (model FinalSiteAmountDesignerStatist) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel {
  260. return []db.JoinModel{
  261. {
  262. Model: FinalSite{},
  263. As: "site",
  264. On: []string{"`site`.`id` = " + model.TableName() + ".`site_id`"},
  265. },
  266. {
  267. Model: JoinAdmin{},
  268. As: "designer",
  269. On: []string{"`designer`.`id` = `site`.`designer_id`"},
  270. },
  271. }
  272. }
  273. func (FinalSiteAmountDesignerStatist) Page() bool {
  274. return true
  275. }
  276. func (FinalSiteAmountDesignerStatist) Count() bool {
  277. return true
  278. }
  279. type FinalSiteAmountSalesmanStatist struct {
  280. SalesmanId float64 `json:"salesman_id" label:"业务员" prop:"select:site.salesman_id"`
  281. SalesmanName string `json:"salesman_name" prop:"select:salesman.username" search:"like"`
  282. SalesmanPhone string `json:"salesman_phone" prop:"select:salesman.phone"`
  283. ContractTotal float64 `json:"contract_total" label:"合同金额" type:"float" prop:"select:sum(zy_final_site_amount.contract_total)"`
  284. Performance float64 `json:"performance" label:"业绩" prop:"select:sum(zy_final_site_amount.performance)"`
  285. Purchase float64 `json:"purchase" label:"代购" type:"float" prop:"select:sum(zy_final_site_amount.purchase)"`
  286. Custom float64 `json:"custom" label:"定制" type:"float" prop:"select:sum(zy_final_site_amount.custom)"`
  287. PersonalCollect float64 `json:"personal_collect" label:"个性化汇总" type:"float" prop:"select:sum(zy_final_site_amount.personal_collect)"`
  288. PersonalMaterial float64 `json:"personal_material" label:"个性化材料" type:"float" prop:"select:sum(zy_final_site_amount.personal_material)"`
  289. PersonalCustom float64 `json:"personal_custom" label:"个性化定制" type:"float" prop:"select:sum(zy_final_site_amount.personal_custom)"`
  290. SpecialItem float64 `json:"special_item" label:"特殊项目代购" type:"float" prop:"select:sum(zy_final_site_amount.special_item)"`
  291. DesignFree float64 `json:"design_free" label:"设计费" type:"float" prop:"select:sum(zy_final_site_amount.design_free)"`
  292. db.BaseModel
  293. }
  294. func (FinalSiteAmountSalesmanStatist) TableName() string {
  295. return "zy_final_site_amount"
  296. }
  297. func (model FinalSiteAmountSalesmanStatist) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool {
  298. if !admin.CheckAuth([]string{"final:finalsitecontract:performance"}, c.GetInt("adminID")) {
  299. adminID := s.Param(c.GetInt("adminID"))
  300. where := fmt.Sprintf("`site`.`salesman_id` = %s", adminID)
  301. s.Where = append(s.Where, fmt.Sprintf("(%s)", where))
  302. }
  303. if signtime1s, ok := data["signtime1"]; ok {
  304. if signtime1, ok := db.ToInt64(signtime1s); ok {
  305. s.Where = append(s.Where, fmt.Sprintf("`site`.`signtime` >= %s", s.Param(signtime1)))
  306. }
  307. }
  308. if signtime2s, ok := data["signtime2"]; ok {
  309. if signtime2, ok := db.ToInt64(signtime2s); ok {
  310. s.Where = append(s.Where, fmt.Sprintf("`site`.`signtime` < %s", s.Param(signtime2+60*60*24)))
  311. }
  312. }
  313. return true
  314. }
  315. func (model FinalSiteAmountSalesmanStatist) GroupBy() string {
  316. return "`site`.`salesman_id`"
  317. }
  318. func (model FinalSiteAmountSalesmanStatist) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel {
  319. return []db.JoinModel{
  320. {
  321. Model: FinalSite{},
  322. As: "site",
  323. On: []string{"`site`.`id` = " + model.TableName() + ".`site_id`"},
  324. },
  325. {
  326. Model: JoinAdmin{},
  327. As: "salesman",
  328. On: []string{"`salesman`.`id` = `site`.`salesman_id`"},
  329. },
  330. }
  331. }
  332. func (FinalSiteAmountSalesmanStatist) Page() bool {
  333. return true
  334. }
  335. func (FinalSiteAmountSalesmanStatist) Count() bool {
  336. return true
  337. }
  338. type JoinDept struct {
  339. db.BaseModel
  340. }
  341. func (JoinDept) TableName() string {
  342. return "zy_dept"
  343. }
  344. type FinalSiteAmountDeptStatist struct {
  345. DeptId float64 `json:"dept_id" label:"部门" prop:"select:site.dept_id"`
  346. Name string `json:"name" prop:"select:concat(updept.name,'/',dept.name)" search:"like"`
  347. ContractTotal float64 `json:"contract_total" label:"合同金额" type:"float" prop:"select:sum(zy_final_site_amount.contract_total)"`
  348. Performance float64 `json:"performance" label:"业绩" prop:"select:sum(zy_final_site_amount.performance)"`
  349. Purchase float64 `json:"purchase" label:"代购" type:"float" prop:"select:sum(zy_final_site_amount.purchase)"`
  350. Custom float64 `json:"custom" label:"定制" type:"float" prop:"select:sum(zy_final_site_amount.custom)"`
  351. PersonalCollect float64 `json:"personal_collect" label:"个性化汇总" type:"float" prop:"select:sum(zy_final_site_amount.personal_collect)"`
  352. PersonalMaterial float64 `json:"personal_material" label:"个性化材料" type:"float" prop:"select:sum(zy_final_site_amount.personal_material)"`
  353. PersonalCustom float64 `json:"personal_custom" label:"个性化定制" type:"float" prop:"select:sum(zy_final_site_amount.personal_custom)"`
  354. SpecialItem float64 `json:"special_item" label:"特殊项目代购" type:"float" prop:"select:sum(zy_final_site_amount.special_item)"`
  355. DesignFree float64 `json:"design_free" label:"设计费" type:"float" prop:"select:sum(zy_final_site_amount.design_free)"`
  356. db.BaseModel
  357. }
  358. func (FinalSiteAmountDeptStatist) TableName() string {
  359. return "zy_final_site_amount"
  360. }
  361. func (model FinalSiteAmountDeptStatist) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool {
  362. if !admin.CheckAuth([]string{"final:finalsitecontract:performance"}, c.GetInt("adminID")) {
  363. where := "1 = 2"
  364. s.Where = append(s.Where, fmt.Sprintf("(%s)", where))
  365. }
  366. if signtime1s, ok := data["signtime1"]; ok {
  367. if signtime1, ok := db.ToInt64(signtime1s); ok {
  368. s.Where = append(s.Where, fmt.Sprintf("`site`.`signtime` >= %s", s.Param(signtime1)))
  369. }
  370. }
  371. if signtime2s, ok := data["signtime2"]; ok {
  372. if signtime2, ok := db.ToInt64(signtime2s); ok {
  373. s.Where = append(s.Where, fmt.Sprintf("`site`.`signtime` < %s", s.Param(signtime2+60*60*24)))
  374. }
  375. }
  376. return true
  377. }
  378. func (model FinalSiteAmountDeptStatist) GroupBy() string {
  379. return "`site`.`dept_id`"
  380. }
  381. func (model FinalSiteAmountDeptStatist) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel {
  382. return []db.JoinModel{
  383. {
  384. Model: FinalSite{},
  385. As: "site",
  386. On: []string{"`site`.`id` = " + model.TableName() + ".`site_id`"},
  387. },
  388. {
  389. Model: JoinDept{},
  390. As: "dept",
  391. On: []string{"`dept`.`id` = `site`.`dept_id`"},
  392. },
  393. {
  394. Model: JoinDept{},
  395. As: "updept",
  396. On: []string{"`updept`.`id` = `dept`.`pid`"},
  397. },
  398. }
  399. }
  400. func (FinalSiteAmountDeptStatist) Page() bool {
  401. return true
  402. }
  403. func (FinalSiteAmountDeptStatist) Count() bool {
  404. return true
  405. }
  406. type FinalSiteAmountShopStatist struct {
  407. ShopId float64 `json:"shop_id" label:"公司" prop:"select:site.shop_id"`
  408. Name string `json:"name" prop:"select:shop.shop_name" search:"like"`
  409. ContractTotal float64 `json:"contract_total" label:"合同金额" type:"float" prop:"select:sum(zy_final_site_amount.contract_total)"`
  410. Performance float64 `json:"performance" label:"业绩" prop:"select:sum(zy_final_site_amount.performance)"`
  411. Purchase float64 `json:"purchase" label:"代购" type:"float" prop:"select:sum(zy_final_site_amount.purchase)"`
  412. Custom float64 `json:"custom" label:"定制" type:"float" prop:"select:sum(zy_final_site_amount.custom)"`
  413. PersonalCollect float64 `json:"personal_collect" label:"个性化汇总" type:"float" prop:"select:sum(zy_final_site_amount.personal_collect)"`
  414. PersonalMaterial float64 `json:"personal_material" label:"个性化材料" type:"float" prop:"select:sum(zy_final_site_amount.personal_material)"`
  415. PersonalCustom float64 `json:"personal_custom" label:"个性化定制" type:"float" prop:"select:sum(zy_final_site_amount.personal_custom)"`
  416. SpecialItem float64 `json:"special_item" label:"特殊项目代购" type:"float" prop:"select:sum(zy_final_site_amount.special_item)"`
  417. DesignFree float64 `json:"design_free" label:"设计费" type:"float" prop:"select:sum(zy_final_site_amount.design_free)"`
  418. db.BaseModel
  419. }
  420. func (FinalSiteAmountShopStatist) TableName() string {
  421. return "zy_final_site_amount"
  422. }
  423. func (model FinalSiteAmountShopStatist) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool {
  424. if !admin.CheckAuth([]string{"final:finalsitecontract:performance"}, c.GetInt("adminID")) {
  425. where := "1 = 2"
  426. s.Where = append(s.Where, fmt.Sprintf("(%s)", where))
  427. }
  428. if signtime1s, ok := data["signtime1"]; ok {
  429. if signtime1, ok := db.ToInt64(signtime1s); ok {
  430. s.Where = append(s.Where, fmt.Sprintf("`site`.`signtime` >= %s", s.Param(signtime1)))
  431. }
  432. }
  433. if signtime2s, ok := data["signtime2"]; ok {
  434. if signtime2, ok := db.ToInt64(signtime2s); ok {
  435. s.Where = append(s.Where, fmt.Sprintf("`site`.`signtime` < %s", s.Param(signtime2+60*60*24)))
  436. }
  437. }
  438. return true
  439. }
  440. func (model FinalSiteAmountShopStatist) GroupBy() string {
  441. return "`site`.`shop_id`"
  442. }
  443. func (model FinalSiteAmountShopStatist) OrderBy() string {
  444. return "`shop`.`order_at` desc"
  445. }
  446. func (model FinalSiteAmountShopStatist) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel {
  447. return []db.JoinModel{
  448. {
  449. Model: FinalSite{},
  450. As: "site",
  451. On: []string{"`site`.`id` = " + model.TableName() + ".`site_id`"},
  452. },
  453. {
  454. Model: JoinShop{},
  455. As: "shop",
  456. On: []string{"`shop`.`id` = `site`.`shop_id`"},
  457. },
  458. }
  459. }
  460. func (FinalSiteAmountShopStatist) Page() bool {
  461. return true
  462. }
  463. func (FinalSiteAmountShopStatist) Count() bool {
  464. return true
  465. }
  466. type FinalSiteAmountStoreStatist struct {
  467. StoreId float64 `json:"store_id" label:"门店" prop:"select:shop.store_id"`
  468. Name string `json:"name" prop:"select:store.name" search:"like"`
  469. ContractTotal float64 `json:"contract_total" label:"合同金额" type:"float" prop:"select:sum(zy_final_site_amount.contract_total)"`
  470. Performance float64 `json:"performance" label:"业绩" prop:"select:sum(zy_final_site_amount.performance)"`
  471. Purchase float64 `json:"purchase" label:"代购" type:"float" prop:"select:sum(zy_final_site_amount.purchase)"`
  472. Custom float64 `json:"custom" label:"定制" type:"float" prop:"select:sum(zy_final_site_amount.custom)"`
  473. PersonalCollect float64 `json:"personal_collect" label:"个性化汇总" type:"float" prop:"select:sum(zy_final_site_amount.personal_collect)"`
  474. PersonalMaterial float64 `json:"personal_material" label:"个性化材料" type:"float" prop:"select:sum(zy_final_site_amount.personal_material)"`
  475. PersonalCustom float64 `json:"personal_custom" label:"个性化定制" type:"float" prop:"select:sum(zy_final_site_amount.personal_custom)"`
  476. SpecialItem float64 `json:"special_item" label:"特殊项目代购" type:"float" prop:"select:sum(zy_final_site_amount.special_item)"`
  477. DesignFree float64 `json:"design_free" label:"设计费" type:"float" prop:"select:sum(zy_final_site_amount.design_free)"`
  478. db.BaseModel
  479. }
  480. func (FinalSiteAmountStoreStatist) TableName() string {
  481. return "zy_final_site_amount"
  482. }
  483. func (model FinalSiteAmountStoreStatist) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool {
  484. if !admin.CheckAuth([]string{"final:finalsitecontract:performance"}, c.GetInt("adminID")) {
  485. where := "1 = 2"
  486. s.Where = append(s.Where, fmt.Sprintf("(%s)", where))
  487. }
  488. if signtime1s, ok := data["signtime1"]; ok {
  489. if signtime1, ok := db.ToInt64(signtime1s); ok {
  490. s.Where = append(s.Where, fmt.Sprintf("`site`.`signtime` >= %s", s.Param(signtime1)))
  491. }
  492. }
  493. if signtime2s, ok := data["signtime2"]; ok {
  494. if signtime2, ok := db.ToInt64(signtime2s); ok {
  495. s.Where = append(s.Where, fmt.Sprintf("`site`.`signtime` < %s", s.Param(signtime2+60*60*24)))
  496. }
  497. }
  498. return true
  499. }
  500. func (model FinalSiteAmountStoreStatist) GroupBy() string {
  501. return "`shop`.`store_id`"
  502. }
  503. func (model FinalSiteAmountStoreStatist) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel {
  504. return []db.JoinModel{
  505. {
  506. Model: FinalSite{},
  507. As: "site",
  508. On: []string{"`site`.`id` = " + model.TableName() + ".`site_id`"},
  509. },
  510. {
  511. Model: JoinShop{},
  512. As: "shop",
  513. On: []string{"`shop`.`id` = `site`.`shop_id`"},
  514. },
  515. {
  516. Model: models.Store{},
  517. As: "store",
  518. On: []string{"`store`.`id` = `shop`.`store_id`"},
  519. },
  520. }
  521. }
  522. func (FinalSiteAmountStoreStatist) Page() bool {
  523. return true
  524. }
  525. func (FinalSiteAmountStoreStatist) Count() bool {
  526. return true
  527. }
  528. func (model FinalSiteAmountStoreStatist) OrderBy() string {
  529. return "`store`.`order_at` desc"
  530. }
  531. type AmountContext struct {
  532. ID int64 `json:"id" label:"ID"`
  533. Site FinalSite `json:"site" label:"工地"`
  534. Pkg FinalPkg `json:"pkg" label:"套餐"`
  535. Fields []FinalPkgField `json:"fields" label:"字段"`
  536. Froms map[string]float64 `json:"froms" label:"表单"`
  537. Calls []string `json:"calls"`
  538. }
  539. func NewAmountContext(site FinalSite, data map[string]interface{}) (*AmountContext, error) {
  540. context := new(AmountContext)
  541. var pkg FinalPkg
  542. db.GetModel(map[string]interface{}{"id": site.PkgId}, &pkg)
  543. var fields []FinalPkgField
  544. db.GetModel(map[string]interface{}{"pkg_id": site.PkgId}, &fields)
  545. context.ID = site.PkgId
  546. context.Site = site
  547. context.Pkg = pkg
  548. context.Fields = fields
  549. context.Froms = make(map[string]float64)
  550. context.Calls = make([]string, 0)
  551. for _, v := range context.Fields {
  552. if v.Type == 0 || v.Type == 1 {
  553. value, _ := db.ToFloat64(data[v.Name])
  554. if v.Type == 1 && value == 0 {
  555. return nil, errors.New("字段未填: " + v.Name)
  556. }
  557. context.Froms[v.Name] = value
  558. }
  559. }
  560. return context, nil
  561. }
  562. func (context *AmountContext) Get(name string) (interface{}, error) {
  563. for _, call := range context.Calls {
  564. if call == name {
  565. return nil, errors.New("circular reference: " + name)
  566. }
  567. }
  568. context.Calls = append(context.Calls, name)
  569. defer func() { context.Calls = context.Calls[:len(context.Calls)-1] }()
  570. if name == "面积" {
  571. return context.Site.Area, nil
  572. }
  573. if value, ok := context.Froms[name]; ok {
  574. return value, nil
  575. }
  576. for _, field := range context.Fields {
  577. if name == field.Name && field.Type == 2 {
  578. result, err := context.Exec(field.Value)
  579. if err != nil {
  580. return nil, err
  581. }
  582. value, _ := db.ToFloat64(result)
  583. context.Froms[name] = float64(math.Round(value*100) / 100)
  584. return value, nil
  585. }
  586. }
  587. return nil, errors.New("undeclared name: " + name)
  588. }
  589. func (context *AmountContext) Exec(expression string) (interface{}, error) {
  590. functions := map[string]govaluate.ExpressionFunction{}
  591. expr, err := govaluate.NewEvaluableExpressionWithFunctions(expression, functions)
  592. if err != nil {
  593. logger.Sugar.Infof("expr: %v error: %v", expression, err.Error())
  594. return nil, err
  595. }
  596. result, err := expr.Eval(context)
  597. if err != nil {
  598. logger.Sugar.Infof("expr: %v error: %v", expression, err.Error())
  599. return nil, err
  600. }
  601. return result, nil
  602. }
  603. func (context *AmountContext) Eval() (float64, float64, float64, float64, float64, float64, float64, float64, float64, error) {
  604. for _, field := range context.Fields {
  605. if _, ok := context.Froms[field.Name]; !ok && field.Type == 2 {
  606. result, err := context.Exec(field.Value)
  607. if err != nil {
  608. return 0, 0, 0, 0, 0, 0, 0, 0, 0, err
  609. }
  610. value, _ := db.ToFloat64(result)
  611. context.Froms[field.Name] = float64(math.Round(value*100) / 100)
  612. }
  613. }
  614. contractTotal := float64(0)
  615. if context.Pkg.ContractTotal != "" {
  616. result, err := context.Exec(context.Pkg.ContractTotal)
  617. if err != nil {
  618. return 0, 0, 0, 0, 0, 0, 0, 0, 0, err
  619. }
  620. value, _ := db.ToFloat64(result)
  621. contractTotal = float64(math.Round(value*100) / 100)
  622. }
  623. performance := float64(0)
  624. if context.Pkg.Performance != "" {
  625. result, err := context.Exec(context.Pkg.Performance)
  626. if err != nil {
  627. return 0, 0, 0, 0, 0, 0, 0, 0, 0, err
  628. }
  629. value, _ := db.ToFloat64(result)
  630. performance = float64(math.Round(value*100) / 100)
  631. }
  632. purchase := float64(0)
  633. if context.Pkg.Purchase != "" {
  634. result, err := context.Exec(context.Pkg.Purchase)
  635. if err != nil {
  636. return 0, 0, 0, 0, 0, 0, 0, 0, 0, err
  637. }
  638. value, _ := db.ToFloat64(result)
  639. purchase = float64(math.Round(value*100) / 100)
  640. }
  641. custom := float64(0)
  642. if context.Pkg.Custom != "" {
  643. result, err := context.Exec(context.Pkg.Custom)
  644. if err != nil {
  645. return 0, 0, 0, 0, 0, 0, 0, 0, 0, err
  646. }
  647. value, _ := db.ToFloat64(result)
  648. custom = float64(math.Round(value*100) / 100)
  649. }
  650. personalCollect := float64(0)
  651. if context.Pkg.PersonalCollect != "" {
  652. result, err := context.Exec(context.Pkg.PersonalCollect)
  653. if err != nil {
  654. return 0, 0, 0, 0, 0, 0, 0, 0, 0, err
  655. }
  656. value, _ := db.ToFloat64(result)
  657. personalCollect = float64(math.Round(value*100) / 100)
  658. }
  659. personalMaterial := float64(0)
  660. if context.Pkg.PersonalMaterial != "" {
  661. result, err := context.Exec(context.Pkg.PersonalMaterial)
  662. if err != nil {
  663. return 0, 0, 0, 0, 0, 0, 0, 0, 0, err
  664. }
  665. value, _ := db.ToFloat64(result)
  666. personalMaterial = float64(math.Round(value*100) / 100)
  667. }
  668. personalCustom := float64(0)
  669. if context.Pkg.PersonalCustom != "" {
  670. result, err := context.Exec(context.Pkg.PersonalCustom)
  671. if err != nil {
  672. return 0, 0, 0, 0, 0, 0, 0, 0, 0, err
  673. }
  674. value, _ := db.ToFloat64(result)
  675. personalCustom = float64(math.Round(value*100) / 100)
  676. }
  677. specialItem := float64(0)
  678. if context.Pkg.SpecialItem != "" {
  679. result, err := context.Exec(context.Pkg.SpecialItem)
  680. if err != nil {
  681. return 0, 0, 0, 0, 0, 0, 0, 0, 0, err
  682. }
  683. value, _ := db.ToFloat64(result)
  684. specialItem = float64(math.Round(value*100) / 100)
  685. }
  686. designFree := float64(0)
  687. if context.Pkg.DesignFree != "" {
  688. result, err := context.Exec(context.Pkg.DesignFree)
  689. if err != nil {
  690. return 0, 0, 0, 0, 0, 0, 0, 0, 0, err
  691. }
  692. value, _ := db.ToFloat64(result)
  693. designFree = float64(math.Round(value*100) / 100)
  694. }
  695. return contractTotal, performance, purchase, custom, personalCollect, personalMaterial, personalCustom, specialItem, designFree, nil
  696. }
  697. func (context *AmountContext) Save() string {
  698. return utils.JsonEncode(context.Froms)
  699. }