contract_service.go 23 KB

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