contract_service.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655
  1. /*
  2. * @description: 合同数据相关操作
  3. * @Author: CP
  4. * @Date: 2020-10-27 11:28:24
  5. * @FilePath: \construction_management\services\contract_service.go
  6. */
  7. package services
  8. import (
  9. "errors"
  10. "fmt"
  11. "html"
  12. "log"
  13. "strconv"
  14. "time"
  15. "github.com/kataras/iris/v12"
  16. "go.mod/comm"
  17. "go.mod/conf"
  18. "go.mod/dao"
  19. "go.mod/datasource"
  20. "go.mod/models"
  21. "go.mod/web/viewmodels"
  22. )
  23. //定义项目用户Service接口
  24. type ContractService interface {
  25. ValidRuleDepth(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  26. ValidRuleTemplate(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  27. ValidRuleSectionAdd(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  28. ValidRuleSectionDelete(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  29. ValidRuleSectionNot(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  30. ValidRuleGet(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  31. ValidRuleSerial(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  32. ValidRuleContractAdd(ctx iris.Context) (*viewmodels.Contracts, error)
  33. ValidRuleContractEdi(ctx iris.Context) (*viewmodels.Contracts, error)
  34. ValidRuleContractDel(ctx iris.Context) (*viewmodels.Contracts, error)
  35. ValidRuleContractRetrunAdd(ctx iris.Context) (*viewmodels.ContractsReturn, error)
  36. ValidRuleContractRetrun(ctx iris.Context) (*viewmodels.ContractsReturn, error)
  37. ValidRuleContractRetrunDel(ctx iris.Context) (*viewmodels.ContractsReturn, error)
  38. ValidRuleContractPaidAdd(ctx iris.Context) (*viewmodels.ContractsPaid, error)
  39. ValidRuleContractPaid(ctx iris.Context) (*viewmodels.ContractsPaid, error)
  40. ValidRuleContractPaidDel(ctx iris.Context) (*viewmodels.ContractsPaid, error)
  41. // 项目节
  42. Get(treeId int, bidsectionId int, projectId int, treeType int) *viewmodels.TreeSectionContract
  43. GetSectionTreeContract(attribution string, bidsectionId int, projectId int, treeType int) []*viewmodels.Contracts
  44. GetSecionTree(bidsectionId int, projectId int, treeType int) *viewmodels.TreeSectionContract
  45. SetSection(templateNumber int, bidsectionId int, projectIdInt int, treeType int) error
  46. SectionAdd(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int, treeType int) (*models.CmTreeContracts, error)
  47. ContractSectionAdd(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int, treeType int) (*models.CmTreeContracts, error)
  48. SectionSave(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int, treeType int) error
  49. UpdateSerial(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int, treeType int) error
  50. SectionDelete(treeId int, bidsectionId int, projectId int, treeType int) error
  51. MoveDepth(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int, treeType int) error
  52. MoveSerial(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int, treeType int) error
  53. GetSecionTreeNotContract(bidsectionId int, projectId int, treeType int) *viewmodels.TreeSectionContract
  54. GetContract(contractId int) *viewmodels.Contracts
  55. Add(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error
  56. Update(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error
  57. Delete(projectId int, bidsectionId int, treeId int, id int) error
  58. Close(projectId int, bidsectionId int, treeId int, id int) error
  59. Unlock(projectId int, bidsectionId int, treeId int, id int) error
  60. GetSurvey(bidsectionId int, projectId int, contractsType int) map[string]interface{}
  61. ReturnCreate(returnData *viewmodels.ContractsReturn, projectId int, bidsectionId int, contractsId int, projectAccountId int) error
  62. ReturnUpdate(returnData *viewmodels.ContractsReturn, projectId int, bidsectionId int, contractsId int, id int) error
  63. ReturnAll(projectId int, bidsectionId int, contractsId int, page int) []*viewmodels.ContractsReturn
  64. ReturnDelete(projectId int, bidsectionId int, contractsId int, id int) error
  65. //支出合同
  66. AddExpenditure(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error
  67. UpdateExpenditure(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error
  68. DeleteExpenditure(projectId int, bidsectionId int, treeId int, id int) error
  69. // 已支付
  70. PaidAll(projectId int, bidsectionId int, contractsId int, page int) []*viewmodels.ContractsPaid
  71. PaidCreate(returnData *viewmodels.ContractsPaid, projectId int, bidsectionId int, contractsId int, projectAccountId int) error
  72. PaidUpdate(returnData *viewmodels.ContractsPaid, projectId int, bidsectionId int, contractsId int, id int) error
  73. PaidDelete(projectId int, bidsectionId int, contractsId int, id int) error
  74. }
  75. //返回service操作类
  76. type contractService struct {
  77. treeContractDao *dao.TreeContractDao
  78. contractDao *dao.ContractDao
  79. contractReturnDao *dao.ContractReturnDao
  80. contractPaidDao *dao.ContractPaidDao
  81. treeDao *dao.TreeDao
  82. annexDao *dao.AnnexDao
  83. }
  84. //创建项目用户service
  85. func NewContractService() ContractService {
  86. return &contractService{
  87. treeContractDao: dao.NewTreeContractDao(datasource.InstanceDbMaster()),
  88. contractDao: dao.NewContractDao(datasource.InstanceDbMaster()),
  89. contractReturnDao: dao.NewContractReturnDao(datasource.InstanceDbMaster()),
  90. contractPaidDao: dao.NewContractPaidDao(datasource.InstanceDbMaster()),
  91. treeDao: dao.NewTreeDao(datasource.InstanceDbMaster()),
  92. annexDao: dao.NewAnnexDao(datasource.InstanceDbMaster()),
  93. }
  94. }
  95. // 升级降级规则验证
  96. func (s *contractService) ValidRuleDepth(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  97. treeSectionVaild := &viewmodels.TreeSectionContract{}
  98. err := ctx.ReadJSON(treeSectionVaild)
  99. if err != nil {
  100. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  101. return treeSectionVaild, err
  102. }
  103. err = treeSectionVaild.ValidateDepth()
  104. if err != nil {
  105. log.Println("参数验证错误, error=", err)
  106. return treeSectionVaild, err
  107. }
  108. return treeSectionVaild, nil
  109. }
  110. // 模板规则验证
  111. func (s *contractService) ValidRuleTemplate(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  112. treeSectionVaild := &viewmodels.TreeSectionContract{}
  113. err := ctx.ReadJSON(treeSectionVaild)
  114. if err != nil {
  115. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  116. return treeSectionVaild, err
  117. }
  118. err = treeSectionVaild.ValidateTemplate()
  119. if err != nil {
  120. log.Println("参数验证错误, error=", err)
  121. return treeSectionVaild, err
  122. }
  123. return treeSectionVaild, nil
  124. }
  125. // 模板规则新增项目节
  126. func (s *contractService) ValidRuleSectionAdd(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  127. treeSectionVaild := &viewmodels.TreeSectionContract{}
  128. err := ctx.ReadJSON(treeSectionVaild)
  129. if err != nil {
  130. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  131. return treeSectionVaild, err
  132. }
  133. err = treeSectionVaild.ValidateSectionAdd()
  134. if err != nil {
  135. log.Println("参数验证错误, error=", err)
  136. return treeSectionVaild, err
  137. }
  138. return treeSectionVaild, nil
  139. }
  140. // 模板规则新增项目节
  141. func (s *contractService) ValidRuleSectionDelete(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  142. treeSectionVaild := &viewmodels.TreeSectionContract{}
  143. err := ctx.ReadForm(treeSectionVaild)
  144. if err != nil {
  145. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  146. return treeSectionVaild, err
  147. }
  148. err = treeSectionVaild.ValidateSectionDelete()
  149. if err != nil {
  150. log.Println("参数验证错误, error=", err)
  151. return treeSectionVaild, err
  152. }
  153. return treeSectionVaild, nil
  154. }
  155. func (s *contractService) ValidRuleSectionNot(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  156. treeSectionVaild := &viewmodels.TreeSectionContract{}
  157. err := ctx.ReadForm(treeSectionVaild)
  158. if err != nil {
  159. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  160. return treeSectionVaild, err
  161. }
  162. err = treeSectionVaild.ValidateSectionNot()
  163. if err != nil {
  164. log.Println("参数验证错误, error=", err)
  165. return treeSectionVaild, err
  166. }
  167. return treeSectionVaild, nil
  168. }
  169. func (s *contractService) ValidRuleGet(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  170. treeSectionVaild := &viewmodels.TreeSectionContract{}
  171. err := ctx.ReadForm(treeSectionVaild)
  172. if err != nil {
  173. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  174. return treeSectionVaild, err
  175. }
  176. err = treeSectionVaild.ValidateSectionDelete()
  177. if err != nil {
  178. log.Println("参数验证错误, error=", err)
  179. return treeSectionVaild, err
  180. }
  181. return treeSectionVaild, nil
  182. }
  183. // 验证序号相关
  184. func (s *contractService) ValidRuleSerial(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  185. treeSectionVaild := &viewmodels.TreeSectionContract{}
  186. err := ctx.ReadJSON(treeSectionVaild)
  187. if err != nil {
  188. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  189. return treeSectionVaild, err
  190. }
  191. err = treeSectionVaild.ValidateSectionSerial()
  192. if err != nil {
  193. log.Println("参数验证错误, error=", err)
  194. return treeSectionVaild, err
  195. }
  196. return treeSectionVaild, nil
  197. }
  198. // 新增合同参数验证
  199. func (s *contractService) ValidRuleContractAdd(ctx iris.Context) (*viewmodels.Contracts, error) {
  200. // 创建一个存放前端传过来参数
  201. contractsVaild := &viewmodels.Contracts{}
  202. // 存放raw的值,放入到contractsVaild
  203. err := ctx.ReadJSON(contractsVaild)
  204. if err != nil {
  205. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  206. return contractsVaild, err
  207. }
  208. // 验证合同传参
  209. err = contractsVaild.ValidateAdd()
  210. if err != nil {
  211. log.Println("参数验证错误, error=", err)
  212. return contractsVaild, err
  213. }
  214. // xss
  215. contractsVaild.Code = html.EscapeString(contractsVaild.Code)
  216. contractsVaild.Name = html.EscapeString(contractsVaild.Name)
  217. contractsVaild.Price = html.EscapeString(contractsVaild.Price)
  218. return contractsVaild, nil
  219. }
  220. // 校验编辑接口
  221. func (s *contractService) ValidRuleContractEdi(ctx iris.Context) (*viewmodels.Contracts, error) {
  222. // 创建一个存放前端传过来参数
  223. contractsVaild := &viewmodels.Contracts{}
  224. // 存放raw的值,放入到contractsVaild
  225. err := ctx.ReadJSON(contractsVaild)
  226. if err != nil {
  227. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  228. return contractsVaild, err
  229. }
  230. // 验证合同传参
  231. err = contractsVaild.ValidateEdi()
  232. if err != nil {
  233. log.Println("参数验证错误, error=", err)
  234. return contractsVaild, err
  235. }
  236. contractsVaild.Content = html.EscapeString(contractsVaild.Content)
  237. contractsVaild.Name = html.EscapeString(contractsVaild.Name)
  238. contractsVaild.Price = html.EscapeString(contractsVaild.Price)
  239. contractsVaild.PartyA = html.EscapeString(contractsVaild.PartyA)
  240. contractsVaild.PartyASigner = html.EscapeString(contractsVaild.PartyASigner)
  241. contractsVaild.PartyB = html.EscapeString(contractsVaild.PartyB)
  242. contractsVaild.PartyBSigner = html.EscapeString(contractsVaild.PartyBSigner)
  243. return contractsVaild, nil
  244. }
  245. // 校验删除合同参数
  246. func (s *contractService) ValidRuleContractDel(ctx iris.Context) (*viewmodels.Contracts, error) {
  247. // 创建一个存放前端传过来参数
  248. contractsVaild := &viewmodels.Contracts{}
  249. // 存放raw的值,放入到contractsVaild
  250. err := ctx.ReadForm(contractsVaild)
  251. if err != nil {
  252. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  253. return contractsVaild, err
  254. }
  255. // 验证合同传参
  256. err = contractsVaild.ValidateDel()
  257. if err != nil {
  258. log.Println("参数验证错误, error=", err)
  259. return contractsVaild, err
  260. }
  261. return contractsVaild, nil
  262. }
  263. //------------------------------------------------------------
  264. // 获得项目节
  265. func (s *contractService) Get(treeId int, bidsectionId int, projectId int, treeType int) *viewmodels.TreeSectionContract {
  266. // 1.获得项目节
  267. section := s.treeContractDao.Get(treeId, bidsectionId, projectId, treeType)
  268. // 2.构造数据
  269. sectionVM := s.makeSectionView(section)
  270. // 3.更新 上移和下一的限制
  271. youngerBrotherList := s.treeContractDao.GetYoungerBrother(section.Serial, section.Depth, section.ParentId, bidsectionId, projectId, treeType)
  272. if len(youngerBrotherList) == 0 {
  273. sectionVM.IsEnd = true
  274. }
  275. sectionVM.ElderBrother = true
  276. elderBrotherList := s.treeContractDao.GetElderBrother(section.Serial, section.Depth, section.ParentId, bidsectionId, projectId, treeType)
  277. if len(elderBrotherList) == 0 {
  278. sectionVM.ElderBrother = false
  279. }
  280. return sectionVM
  281. }
  282. // 获得合同详情
  283. func (s *contractService) GetContract(contractId int) *viewmodels.Contracts {
  284. contract := s.contractDao.Get(contractId)
  285. contractsVM := s.makeContractVM(contract)
  286. return &contractsVM
  287. }
  288. // 新增合同
  289. func (s *contractService) Add(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error {
  290. // 1. 项目节存在
  291. contracts := s.treeContractDao.Get(treeId, bidsectionId, projectId, 0)
  292. if contracts.Id == 0 {
  293. return errors.New("未找到项目节")
  294. }
  295. // 2.项目节是没有合同
  296. if contracts.ContractId != 0 {
  297. return errors.New("该项目节上已经存在合同")
  298. }
  299. // 2-1.查找合同编号是否存在
  300. codeData := s.contractDao.GetByCode(projectId, bidsectionId, contractData.Code, 1)
  301. if len(codeData) != 0 {
  302. return errors.New("该合同编号已经存在")
  303. }
  304. // 3.新增合同 --合计标段上的金额
  305. contractsCm := &models.CmContracts{}
  306. contractsCm.Code = contractData.Code
  307. contractsCm.Name = contractData.Name
  308. contractsCm.ContractsType = 1
  309. contractsCm.Price = contractData.Price
  310. contractsCm.Returned = "0"
  311. contractsCm.Paid = "0"
  312. contractsCm.TreeId = treeId
  313. contractsCm.ProjectId = projectId
  314. contractsCm.BidsectionId = bidsectionId
  315. contractsCm.Status = 0
  316. contractsCm.CreateTime = time.Now()
  317. contractsCm.UpdateTime = time.Now()
  318. err := s.contractDao.Add(contractsCm)
  319. if err != nil {
  320. return err
  321. }
  322. // 3.获得该标段下合同总数 - 总收入金额
  323. contractTotal, priceTotal := s.getContractTotalAndPrice(bidsectionId, projectId, 0)
  324. // 更新标段目录上合同金额和总数
  325. err = s.treeDao.UpdateContractsAndIncomePrice(projectId, bidsectionId, contractTotal, priceTotal)
  326. if err != nil {
  327. return err
  328. }
  329. return nil
  330. }
  331. // 更新合同
  332. func (s *contractService) Update(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error {
  333. // 1. 项目节存在
  334. contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId, 0)
  335. if contractsTree.Id == 0 {
  336. return errors.New("未找到项目节")
  337. }
  338. // 2.项目节是没有合同
  339. if contractsTree.ContractId == 0 {
  340. return errors.New("该项目节上没有找到合同")
  341. }
  342. // 3.合同锁定 不能删除
  343. if contractsTree.ContractLocking == 1 {
  344. return errors.New("该合同已锁定")
  345. }
  346. contractsCm := &models.CmContracts{}
  347. contractsCm.Id = contractsTree.ContractId
  348. contractsCm.Content = contractData.Content
  349. contractsCm.Name = contractData.Name
  350. contractsCm.Price = contractData.Price
  351. contractsCm.PartyA = contractData.PartyA
  352. contractsCm.PartyASigner = contractData.PartyASigner
  353. contractsCm.PartyB = contractData.PartyB
  354. contractsCm.PartyBSigner = contractData.PartyBSigner
  355. loc, _ := time.LoadLocation("Local")
  356. SignerTime, err := time.ParseInLocation(conf.SysTimeform, contractData.SignerTime, loc)
  357. if err != nil {
  358. return errors.New("签约时间填写异常")
  359. }
  360. contractsCm.SignerTime = SignerTime
  361. contractsCm.Remarks = contractData.Remarks
  362. columns := []string{"Content", "Name", "Price", "PartyA", "PartyASigner", "PartyB", "PartyBSigner"}
  363. err = s.contractDao.Update(contractsCm, columns, projectId, bidsectionId, treeId)
  364. if err != nil {
  365. return err
  366. }
  367. // 3.获得该标段下合同总数 - 总收入金额
  368. contractTotal, priceTotal := s.getContractTotalAndPrice(bidsectionId, projectId, 0)
  369. // 更新标段目录上合同金额和总数
  370. err = s.treeDao.UpdateContractsAndIncomePrice(projectId, bidsectionId, contractTotal, priceTotal)
  371. if err != nil {
  372. return err
  373. }
  374. return nil
  375. }
  376. // 删除合同
  377. func (s *contractService) Delete(projectId int, bidsectionId int, treeId int, id int) error {
  378. // 1. 项目节存在
  379. contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId, 0)
  380. if contractsTree.Id == 0 {
  381. return errors.New("未找到项目节")
  382. }
  383. // 2.项目节是没有合同
  384. if contractsTree.ContractId == 0 {
  385. return errors.New("该项目节上没有找到合同")
  386. }
  387. // 3.合同锁定 不能删除
  388. if contractsTree.ContractLocking == 1 {
  389. return errors.New("该合同已锁定")
  390. }
  391. // 删除合同
  392. err := s.contractDao.Delete(projectId, bidsectionId, treeId, id)
  393. if err != nil {
  394. return err
  395. }
  396. // 3.获得该标段下合同总数 - 总收入金额
  397. contractTotal, priceTotal := s.getContractTotalAndPrice(bidsectionId, projectId, 0)
  398. // 更新标段目录上合同金额和总数
  399. err = s.treeDao.UpdateContractsAndIncomePrice(projectId, bidsectionId, contractTotal, priceTotal)
  400. if err != nil {
  401. return err
  402. }
  403. // 4.更新回款总金额
  404. err = s.contractReturnDao.UpdateTotalPrice(projectId, bidsectionId, id)
  405. if err != nil {
  406. return err
  407. }
  408. return nil
  409. }
  410. // 关闭合同
  411. func (s *contractService) Close(projectId int, bidsectionId int, treeId int, id int) error {
  412. // 1. 项目节存在
  413. contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId, 0)
  414. if contractsTree.Id == 0 {
  415. return errors.New("未找到项目节")
  416. }
  417. // 2.项目节是没有合同
  418. if contractsTree.ContractId == 0 {
  419. return errors.New("该项目节上没有找到合同")
  420. }
  421. // 3.合同锁定 不能删除
  422. if contractsTree.ContractLocking == 1 {
  423. return errors.New("该合同已锁定")
  424. }
  425. // 关闭合同
  426. err := s.contractDao.Close(projectId, bidsectionId, treeId, id)
  427. if err != nil {
  428. return err
  429. }
  430. return nil
  431. }
  432. // 解锁合同
  433. func (s *contractService) Unlock(projectId int, bidsectionId int, treeId int, id int) error {
  434. // 1. 项目节存在
  435. contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId, 0)
  436. if contractsTree.Id == 0 {
  437. return errors.New("未找到项目节")
  438. }
  439. // 2.项目节是没有合同
  440. if contractsTree.ContractId == 0 {
  441. return errors.New("该项目节上没有找到合同")
  442. }
  443. // 解锁合同
  444. err := s.contractDao.Unlock(projectId, bidsectionId, treeId, id)
  445. if err != nil {
  446. return err
  447. }
  448. return nil
  449. }
  450. //获得合同收入概况
  451. func (s *contractService) GetSurvey(bidsectionId int, projectId int, contractsType int) map[string]interface{} {
  452. // 1.获得收入合同
  453. year := time.Now().Year()
  454. incomeList := s.contractDao.GetTypeYear(bidsectionId, projectId, contractsType, year)
  455. // 2.初始化
  456. totalContractPrice := 0.00
  457. totalTypePrice := 0.00
  458. performNumber := 0
  459. closeNumber := 0
  460. uncloseNumber := 0
  461. // 3.当年数据初始化
  462. returnDate := map[string]float64{
  463. fmt.Sprintf("%d-01", year): 0.00,
  464. fmt.Sprintf("%d-02", year): 0.00,
  465. fmt.Sprintf("%d-03", year): 0.00,
  466. fmt.Sprintf("%d-04", year): 0.00,
  467. fmt.Sprintf("%d-05", year): 0.00,
  468. fmt.Sprintf("%d-06", year): 0.00,
  469. fmt.Sprintf("%d-07", year): 0.00,
  470. fmt.Sprintf("%d-08", year): 0.00,
  471. fmt.Sprintf("%d-09", year): 0.00,
  472. fmt.Sprintf("%d-10", year): 0.00,
  473. fmt.Sprintf("%d-11", year): 0.00,
  474. fmt.Sprintf("%d-12", year): 0.00,
  475. }
  476. for _, item := range incomeList {
  477. contractPrice, _ := strconv.ParseFloat(item.Price, 64)
  478. totalContractPrice = totalContractPrice + contractPrice
  479. typePrice := 0.00
  480. if contractsType == 1 {
  481. typePrice, _ = strconv.ParseFloat(item.Returned, 64)
  482. totalTypePrice = totalTypePrice + typePrice
  483. } else {
  484. typePrice, _ = strconv.ParseFloat(item.Paid, 64)
  485. totalTypePrice = totalTypePrice + typePrice
  486. }
  487. if item.Status == 0 {
  488. performNumber = performNumber + 1
  489. } else if item.Status == 1 {
  490. uncloseNumber = uncloseNumber + 1
  491. } else if item.Status == 2 {
  492. closeNumber = closeNumber + 1
  493. }
  494. returnDate[item.CreateTime.Format(conf.SysTimeformMonth)] = returnDate[item.CreateTime.Format(conf.SysTimeformMonth)] + typePrice
  495. }
  496. totalContractPrice, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", totalContractPrice), 64)
  497. totalTypePrice, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", totalTypePrice), 64)
  498. // ac := accounting.Accounting{Symbol: "", Precision: 2}
  499. surveryData := map[string]interface{}{
  500. "totalContractPrice": totalContractPrice,
  501. "totalContractPriceShow": totalContractPrice,
  502. // "totalReturnPrice": ac.FormatMoney(totalReturnPrice),
  503. "performNumber": performNumber,
  504. "closeNumber": closeNumber,
  505. "uncloseNumber": uncloseNumber,
  506. "returnDate": returnDate,
  507. }
  508. if contractsType == 1 {
  509. surveryData["totalReturnPriceShow"] = totalTypePrice
  510. } else {
  511. surveryData["totalPaidPriceShow"] = totalTypePrice
  512. }
  513. return surveryData
  514. }
  515. // 获得合同总数量和总金额
  516. func (s *contractService) getContractTotalAndPrice(bidsectionId int, projectId int, treeType int) (contractTotal int, priceTotal float64) {
  517. contractListAll := s.treeContractDao.GetContractAll(bidsectionId, projectId)
  518. // 获得收入合同
  519. contractList := s.treeContractDao.GetContract(bidsectionId, projectId, treeType)
  520. priceTotal = 0.00
  521. for _, item := range contractList {
  522. contractPrice, _ := strconv.ParseFloat(item.ContractPrice, 64)
  523. priceTotal = priceTotal + contractPrice
  524. }
  525. // 合同总数
  526. // contractTotal = len(contractList) + 1
  527. contractTotal = len(contractListAll)
  528. // 合同收入总金额
  529. // price, _ := strconv.ParseFloat(priceString, 64)
  530. // priceTotal = priceTotal + price
  531. // 保留2位小数
  532. priceTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", priceTotal), 64)
  533. return contractTotal, priceTotal
  534. }
  535. // 构建合同详情视图
  536. func (s *contractService) makeContractVM(contract *models.CmContracts) viewmodels.Contracts {
  537. contractsVM := viewmodels.Contracts{}
  538. if contract.Id == 0 {
  539. return contractsVM
  540. }
  541. id, _ := comm.AesEncrypt(strconv.Itoa(contract.Id), conf.SignSecret)
  542. treeId, _ := comm.AesEncrypt(strconv.Itoa(contract.TreeId), conf.SignSecret)
  543. bidsectionId, _ := comm.AesEncrypt(strconv.Itoa(contract.BidsectionId), conf.SignSecret)
  544. contractsVM.Id = id
  545. contractsVM.TreeId = treeId
  546. contractsVM.ContractsType = contract.ContractsType
  547. contractsVM.BidsectionId = bidsectionId
  548. contractsVM.Name = contract.Name
  549. contractsVM.Content = contract.Content
  550. contractsVM.Code = contract.Code
  551. contractsVM.PartyA = contract.PartyA
  552. contractsVM.PartyASigner = contract.PartyASigner
  553. contractsVM.PartyB = contract.PartyB
  554. contractsVM.PartyBSigner = contract.PartyBSigner
  555. contractsVM.Remarks = contract.Remarks
  556. contractsVM.Price = contract.Price
  557. contractsVM.Returned = contract.Returned
  558. contractsVM.Paid = contract.Paid
  559. contractsVM.Status = contract.Status
  560. contractsVM.Locking = contract.Locking
  561. contractsVM.CreateTime = contract.CreateTime.Format(conf.SysTimeform)
  562. contractsVM.UpdateTime = contract.UpdateTime.Format(conf.SysTimeform)
  563. // nilTime := time.Time{}
  564. // contract.SignerTime != nilTime
  565. if !contract.SignerTime.IsZero() {
  566. contractsVM.SignerTime = contract.SignerTime.Format(conf.SysTimeform)
  567. }
  568. return contractsVM
  569. }