作者 tangxvhui

Merge branch 'test'

正在显示 41 个修改的文件 包含 1803 行增加1149 行删除

要显示太多修改。

为保证性能只显示 41 of 41+ 个文件。

... ... @@ -7,3 +7,8 @@ prod 环境 http://performance-back-prd.fjmaimaimai.com/
前端页面地址
test环境 https://enterprise-platform-dev.fjmaimaimai.com/#/login
测试账号 17708397664 密码123456
短信模板ID:5475050 短信内容: 您好,#name#,百忙之中不要忘记填写今天的绩效自评反馈哦
\ No newline at end of file
... ...
... ... @@ -10,6 +10,7 @@ require (
github.com/bwmarrin/snowflake v0.3.0
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/go-pg/pg/v10 v10.10.7
github.com/go-redis/redis/v8 v8.11.5
github.com/linmadan/egglib-go v0.0.0-20210827085852-177fa745932d
github.com/xuri/excelize/v2 v2.6.1
)
... ...
... ... @@ -120,6 +120,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/eapache/go-resiliency v1.1.0 h1:1NtRmCAqadE2FN4ZcN6g90TP3uk8cg9rn9eNK2197aU=
... ... @@ -171,12 +173,16 @@ github.com/go-pg/pg/v10 v10.10.7 h1:Q7Bs45kP9MIg03v/ejwdqsPd1T0cecgeDoTJVg/UJuQ=
github.com/go-pg/pg/v10 v10.10.7/go.mod h1:GLmFXufrElQHf5uzM3BQlcfwV3nsgnHue5uzjQ6Nqxg=
github.com/go-pg/zerochecker v0.2.0 h1:pp7f72c3DobMWOb2ErtZsnrPaSvHd2W4o9//8HtF4mU=
github.com/go-pg/zerochecker v0.2.0/go.mod h1:NJZ4wKL0NmTtz0GKCoJ8kym6Xn/EQzXRl2OnAe7MmDo=
github.com/go-redis/redis v6.14.2+incompatible h1:UE9pLhzmWf+xHNmZsoccjXosPicuiNaInPgym8nzfg0=
github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
... ... @@ -241,6 +247,7 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
... ... @@ -284,6 +291,7 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03 h1:FUwcHNlEqkqLjLBdCp5PRlCFijNjvcYANOZXzCfXwCM=
... ... @@ -364,8 +372,9 @@ github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
... ... @@ -374,14 +383,19 @@ github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W
github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M=
github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA=
github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
... ... @@ -656,6 +670,7 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
... ... @@ -725,6 +740,7 @@ golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210218155724-8ebf48af031b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
... ... @@ -735,6 +751,7 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210923061019-b8560ed6a9b7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 h1:WIoqL4EROvwiPdUtaip4VcDdpZ4kha7wBWZrbVKCIZg=
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
... ... @@ -803,12 +820,12 @@ golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20201211185031-d93e913c1a58/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
... ...
package main
import (
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/constant"
"time"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/constant"
"github.com/beego/beego/v2/server/web"
serviceTask "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/node_task"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/notify"
serviceSummary "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/summary_evaluation/service"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/log"
_ "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/port/beego"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/port/consumer"
... ... @@ -13,12 +16,8 @@ import (
func main() {
startNodeTask()
// tree := web.PrintTree()
// methods := tree["Data"].(web.M)
// for k, v := range methods {
// fmt.Printf("%s => %v \n", k, v)
// }
startSummaryEvaluation()
go notify.RunTaskSmsNotify()
go consumer.Run()
web.Run()
}
... ... @@ -27,7 +26,7 @@ func main() {
func startNodeTask() {
go func() {
nodeTaskService := serviceTask.NewNodeTaskService()
for {
var duration time.Duration
if constant.Env == "prd" {
duration = time.Minute * 5
... ... @@ -35,10 +34,32 @@ func startNodeTask() {
duration = time.Minute * 1
}
timer := time.NewTimer(duration)
for {
<-timer.C
if err := nodeTaskService.SendEvaluationNode(); err != nil {
log.Logger.Error(err.Error())
}
timer.Reset(duration) // 重置定时
}
}()
}
// 定时任务-间隔检查时间,发送周期评估
func startSummaryEvaluation() {
go func() {
var duration time.Duration
if constant.Env == "prd" {
duration = time.Minute * 5
} else {
duration = time.Minute * 1
}
timer := time.NewTimer(duration)
for {
<-timer.C
if err := serviceSummary.TaskSendSummaryEvaluation(); err != nil {
log.Logger.Error(err.Error())
}
timer.Reset(duration) // 重置定时
}
}()
}
... ...
... ... @@ -31,3 +31,20 @@ func TestFontToken(t *testing.T) {
}
fmt.Println(userAuth.CreateAccessToken())
}
func TestOtherAccountToken(t *testing.T) {
domain.JWTExpiresSecond = 3600 * 24 * 365
userAuth := &domain.UserAuth{
UserId: 3422174102828544,
CompanyId: 8,
Phone: "17708397664",
PlatformId: 29,
Name: "杨欢",
AdminType: 1,
}
tk, _ := userAuth.CreateAccessToken()
t.Log(tk)
//fmt.Println(userAuth.CreateAccessToken())
}
... ...
package adapter
type DepartmentAdapter struct {
Id int64 `comment:"部门ID" json:"id,string"`
Name string `comment:"部门名称" json:"name"`
CompanyId int64 `comment:"公司ID" json:"companyId,string"`
ParentId int64 `comment:"父级ID" json:"parentId,string"`
Departments []*DepartmentAdapter `comment:"子部门" json:"departments"`
UserTotal int `comment:"部门用户总数量(包含子部门)" json:"userTotal"`
}
... ...
package command
import "github.com/beego/beego/v2/core/validation"
// QueryDepartmentCommand 查询公司的所有部门和人数
type QueryDepartmentCommand struct {
CompanyId int64 `cname:"公司ID" json:"companyId"`
}
func (in *QueryDepartmentCommand) Valid(*validation.Validation) {
}
... ...
package department
import (
"github.com/linmadan/egglib-go/core/application"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/department/adapter"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/department/command"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/factory"
)
type SDepartmentService struct{}
func NewDepartmentService() *SDepartmentService {
newService := &SDepartmentService{}
return newService
}
func (ds *SDepartmentService) ListAndCount(in *command.QueryDepartmentCommand) (interface{}, error) {
transactionContext, err := factory.ValidateStartTransaction(in)
if err != nil {
return nil, err
}
defer func() {
transactionContext.RollbackTransaction()
}()
departmentRepository := factory.CreateDepartmentRepository(map[string]interface{}{"transactionContext": transactionContext})
userRepository := factory.CreateUserRepository(map[string]interface{}{"transactionContext": transactionContext})
companyRepository := factory.CreateCompanyRepository(map[string]interface{}{"transactionContext": transactionContext})
departments, err := departmentRepository.FindAll(in.CompanyId)
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
adapters := make([]*adapter.DepartmentAdapter, 0)
mapDep := map[int64]*adapter.DepartmentAdapter{}
mapDepNum := map[int64]int{}
// 已经按等级Level升序排序, 1级> 2级> ...
for i := range departments {
apt := &adapter.DepartmentAdapter{
Id: departments[i].Id,
Name: departments[i].Name,
CompanyId: departments[i].CompanyId,
ParentId: departments[i].ParentId,
Departments: make([]*adapter.DepartmentAdapter, 0),
}
mapDep[apt.Id] = apt
// 一级节点
if apt.ParentId == 0 {
adapters = append(adapters, apt)
} else {
// 上级节点若存在,加到上级的子节点
if parent, ok := mapDep[apt.ParentId]; ok {
parent.Departments = append(parent.Departments, apt)
}
}
// 所有部门ID
mapDepNum[apt.Id] = 0
}
// 获取公司信息
company, err := companyRepository.FindOne(map[string]interface{}{"id": in.CompanyId})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
// 获取所有用户
userCount, users, err := userRepository.Find(map[string]interface{}{"companyId": in.CompanyId})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
for i := range users {
v := users[i]
// 注.如果用户部门下挂到公司下,顶级公司数量暂时使用所有用户数量(userCount)
for _, depId := range v.DepartmentId {
if count, ok := mapDepNum[int64(depId)]; ok {
mapDepNum[int64(depId)] = count + 1 // 部门数量 + 1
}
}
}
// 计算部门下的用户总数量
ds.calculateChildTotal(mapDepNum, adapters)
// 创建顶级部门(公司)
top := make([]*adapter.DepartmentAdapter, 0)
top = append(top, &adapter.DepartmentAdapter{
Id: 0,
Name: company.Name,
CompanyId: company.Id,
ParentId: 0,
Departments: adapters,
UserTotal: userCount, // 公司下的所有用户
})
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
return map[string]interface{}{"list": top}, nil
}
// 计算子部门总量
func (ds *SDepartmentService) calculateChildTotal(mapDepNum map[int64]int, departments []*adapter.DepartmentAdapter) int {
var total = 0
for i := range departments {
// 子部门总数量
var childTotal = ds.calculateChildTotal(mapDepNum, departments[i].Departments)
// 当前部门数量
if count, ok := mapDepNum[departments[i].Id]; ok {
childTotal += count
}
// 更新部门数量
departments[i].UserTotal = childTotal
total += childTotal
}
return total
}
... ...
... ... @@ -160,6 +160,7 @@ func (rs *EvaluationCycleService) Update(in *command.UpdateCycleCommand) (interf
cycleRepository := factory.CreateEvaluationCycleRepository(map[string]interface{}{"transactionContext": transactionContext})
cycleTemplateRepository := factory.CreateEvaluationCycleTemplateRepository(map[string]interface{}{"transactionContext": transactionContext})
templateRepository := factory.CreateEvaluationTemplateRepository(map[string]interface{}{"transactionContext": transactionContext})
ruleRepository := factory.CreateEvaluationRuleRepository(map[string]interface{}{"transactionContext": transactionContext})
// 检测名称重复(排除自己)
count, err := cycleRepository.Count(map[string]interface{}{"name": in.Name, "companyId": in.CompanyId, "notId": in.Id})
... ... @@ -208,8 +209,49 @@ func (rs *EvaluationCycleService) Update(in *command.UpdateCycleCommand) (interf
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
// 获取所有模板中的规则对象数据
ruleMap := map[int64]*domain.EvaluationRule{}
for i := range templates {
v := templates[i]
for j := range v.LinkNodes {
node := v.LinkNodes[j]
for k := range node.NodeContents {
nodeContent := node.NodeContents[k]
if nodeContent.RuleId != 0 {
ruleMap[nodeContent.RuleId] = nil
}
}
}
}
ruleIds := make([]int64, 0)
for k := range ruleMap {
ruleIds = append(ruleIds, k)
}
if len(ruleIds) > 0 {
if _, rules, err := ruleRepository.Find(map[string]interface{}{"ids": ruleIds, "companyId": in.CompanyId}); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
for i := range rules {
ruleMap[rules[i].Id] = rules[i]
}
}
}
for i := range templates {
v := templates[i]
// 对评估模板中的评估规则进行数据赋值
for j := range v.LinkNodes {
node := v.LinkNodes[j]
for k := range node.NodeContents {
nodeContent := node.NodeContents[k]
if rule, ok := ruleMap[nodeContent.RuleId]; ok {
nodeContent.Rule = rule
}
}
}
cycleTemplate := &domain.EvaluationCycleTemplate{
Id: 0,
Name: v.Name,
... ...
... ... @@ -2,6 +2,9 @@ package service
import (
"fmt"
"strconv"
"time"
"github.com/linmadan/egglib-go/core/application"
"github.com/linmadan/egglib-go/utils/tool_funs"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/evaluation_project/adapter"
... ... @@ -9,8 +12,6 @@ import (
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/factory"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/utils"
"strconv"
"time"
)
type EvaluationProjectService struct {
... ... @@ -251,7 +252,6 @@ func (rs *EvaluationProjectService) UpdateTemplate(in *command.UpdateProjectTemp
node.TimeStart = &start
node.TimeEnd = &end
}
project, err = projectRepository.Insert(project)
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
... ... @@ -365,7 +365,7 @@ func (rs *EvaluationProjectService) Remove(in *command.DeleteProjectCommand) (in
projectRepository := factory.CreateEvaluationProjectRepository(map[string]interface{}{"transactionContext": transactionContext})
taskRepository := factory.CreateNodeTaskRepository(map[string]interface{}{"transactionContext": transactionContext})
staffRepository := factory.CreateStaffAssessTaskRepository(map[string]interface{}{"transactionContext": transactionContext})
summaryRepository := factory.CreateSummaryEvaluationRepository(map[string]interface{}{"transactionContext": transactionContext})
project, err := projectRepository.FindOne(map[string]interface{}{"id": in.Id})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
... ... @@ -378,7 +378,10 @@ func (rs *EvaluationProjectService) Remove(in *command.DeleteProjectCommand) (in
if err := staffRepository.RemoveByProjectId(int(project.Id)); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
// 删除项目已生成的周期评估数据
if err := summaryRepository.RemoveByProjectId(int(project.Id)); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
// 移除项目关联的所有定时任务
tasks, err := taskRepository.Find(map[string]interface{}{"projectId": project.Id})
if err != nil {
... ... @@ -521,6 +524,11 @@ func (rs *EvaluationProjectService) Activate(in *command.ActivateProjectCommand)
}
}
err = rs.generateEvaluationItemUsed(transactionContext, project)
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
... ... @@ -600,3 +608,46 @@ func (rs *EvaluationProjectService) CheckRecipients(in *command.CheckRecipientCo
}
return map[string]interface{}{"repeatNum": repeatNum}, nil
}
func (rs *EvaluationProjectService) generateEvaluationItemUsed(transactionContext application.TransactionContext, project *domain.EvaluationProject) error {
var itemUsedList []*domain.EvaluationItemUsed
nowTime := time.Now()
for _, v := range project.Template.LinkNodes {
for i2, v2 := range v.NodeContents {
item := domain.EvaluationItemUsed{
Id: 0,
CompanyId: int(project.CompanyId),
EvaluationProjectId: int(project.Id),
NodeId: int(v.Id),
NodeType: v.Type,
SortBy: i2 + 1,
Category: v2.Category,
Name: v2.Name,
PromptTitle: v2.PromptTitle,
PromptText: v2.PromptText,
EntryItems: v2.EntryItems,
Weight: v2.Weight,
Required: v2.Required,
EvaluatorId: int(v2.EvaluatorId),
CreatedAt: nowTime,
UpdatedAt: nowTime,
// RuleType: 0,
// Rule: *v2.Rule,
}
if v2.Rule != nil {
item.RuleType = v2.Rule.Type
item.Rule = *v2.Rule
}
itemUsedList = append(itemUsedList, &item)
}
}
itemUsedRepo := factory.CreateEvaluationItemUsedRepository(map[string]interface{}{
"transactionContext": transactionContext,
})
err := itemUsedRepo.BatchInsert(itemUsedList)
if err != nil {
return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
return nil
}
... ...
package command
import (
"fmt"
"github.com/beego/beego/v2/core/validation"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/utils"
)
type UpdateTemplateCommand struct {
... ... @@ -20,19 +22,25 @@ func (in *UpdateTemplateCommand) Valid(validation *validation.Validation) {
return
}
//if len(in.Name) > 40 {
// validation.SetError("name", "模板名称最大长度40个字符")
// return
//}
//
//if len(in.Describe) > 100 {
// validation.SetError("describe", "备注最大长度100个字符")
// return
//}
if len(in.LinkNodes) == 0 {
validation.SetError("linkNodes", "评估模板流程不能为空")
return
} else {
for i := range in.LinkNodes {
linkNode := in.LinkNodes[i]
// 如果有评估内容时,内容权重相加 = 100%
if len(linkNode.NodeContents) > 0 {
weightTotal := 0.0
for i2 := range linkNode.NodeContents {
weightTotal += linkNode.NodeContents[i2].Weight
}
if weightTotal != 100 {
formatWeightTotal := utils.FormatFloatDecimal(weightTotal, 2)
validation.SetError("linkNodes", fmt.Sprintf("总权重值错误,当前%s的总权重值为:%s%%(必须等于100%%)", linkNode.Name, formatWeightTotal))
return
}
}
}
}
}
... ...
... ... @@ -168,3 +168,43 @@ func CreateStaffAssessCacheRepository(options map[string]interface{}) domain.Sta
}
return repository.NewStaffAssessCacheRepository(transactionContext)
}
func CreateSummaryEvaluationRepository(options map[string]interface{}) domain.SummaryEvaluationRepository {
var transactionContext *pg.TransactionContext
if value, ok := options["transactionContext"]; ok {
transactionContext = value.(*pg.TransactionContext)
}
return repository.NewSummaryEvaluationRepository(transactionContext)
}
func CreateSummaryEvaluationValueRepository(options map[string]interface{}) domain.SummaryEvaluationValueRepository {
var transactionContext *pg.TransactionContext
if value, ok := options["transactionContext"]; ok {
transactionContext = value.(*pg.TransactionContext)
}
return repository.NewSummaryEvaluationValueRepository(transactionContext)
}
func CreateEvaluationItemUsedRepository(options map[string]interface{}) domain.EvaluationItemUsedRepository {
var transactionContext *pg.TransactionContext
if value, ok := options["transactionContext"]; ok {
transactionContext = value.(*pg.TransactionContext)
}
return repository.NewEvaluationItemUsedRepository(transactionContext)
}
func CreatePermissionRepository(options map[string]interface{}) domain.PermissionRepository {
var transactionContext *pg.TransactionContext
if value, ok := options["transactionContext"]; ok {
transactionContext = value.(*pg.TransactionContext)
}
return repository.NewPermissionRepository(transactionContext)
}
func CreateLogSmsRepository(options map[string]interface{}) domain.LogSmsRepository {
var transactionContext *pg.TransactionContext
if value, ok := options["transactionContext"]; ok {
transactionContext = value.(*pg.TransactionContext)
}
return repository.NewLogSmsRepository(transactionContext)
}
... ...
... ... @@ -2,10 +2,11 @@ package service
import (
"fmt"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/log"
"strconv"
"time"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/log"
"github.com/linmadan/egglib-go/core/application"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/factory"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/staff_assess/command"
... ... @@ -153,7 +154,7 @@ func (rs *NodeTaskService) SendEvaluationNode() error {
// 创建发送任务
_, err := staffAssessService.CreateStaffAssessTask(transactionContext, csat)
if err != nil {
return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
return application.ThrowError(application.INTERNAL_SERVER_ERROR, "创建发送任务"+err.Error())
}
} else {
task.NextSentAt = nil // 项目不存在,取消周期任务发送
... ...
package notify
import "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain"
var taskSmsNotify *notifySms
// 检查并发送短信通知
func RunTaskSmsNotify() {
taskSmsNotify = &notifySms{}
taskSmsNotify.init()
taskSmsNotify.regist(notifyStaffAssess{})
taskSmsNotify.regist(notifySummaryEvaluation{})
taskSmsNotify.runTask()
}
// 每日自评短信通知 ,预创建待发送的短信消息
func AddNotifyStaffAssess(param *domain.StaffAssess) {
newNotify := notifyStaffAssess{}
newSms := newNotify.makeNotify(param)
taskSmsNotify.addTask(newSms)
}
// 周期自评短信通知 ,预创建待发送的短信消息
func AddNotifySummaryEvaluation(param *domain.SummaryEvaluation) {
newNotify := notifySummaryEvaluation{}
newSms := newNotify.makeNotify(param)
taskSmsNotify.addTask(newSms)
}
... ...
package notify
import (
"fmt"
"time"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/factory"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/constant"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/infrastructure/serviceGateway"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/log"
)
type notifySendOrNot interface {
from() string
ifSend(index int) (bool, error)
}
// 短信通知
type notifySms struct {
newSms chan *domain.LogSms
interval time.Duration
sendOrNot map[string]notifySendOrNot //到点后判断是否真的发送短信消息
}
func (notices *notifySms) init() {
notices.newSms = make(chan *domain.LogSms, 50)
notices.interval = 5 * time.Minute
if constant.Env != "prd" {
notices.interval = 1 * time.Minute
}
notices.sendOrNot = map[string]notifySendOrNot{}
}
func (notices *notifySms) regist(ifsend notifySendOrNot) {
notices.sendOrNot[ifsend.from()] = ifsend
}
func (notices *notifySms) addTask(task *domain.LogSms) {
notices.newSms <- task
}
// RunTask 执行短信通知任务
func (notices *notifySms) runTask() {
timer := time.NewTimer(notices.interval)
for {
select {
case newSms := <-notices.newSms:
err := notices.addNewSms(newSms)
if err != nil {
e := fmt.Sprintf("添加短信通知任务:%+v %s", newSms, err)
log.Logger.Error(e)
}
case <-timer.C:
nowTime := time.Now()
err := notices.checkSendSms()
if err != nil {
log.Logger.Error("检查发送短信通知任务:" + err.Error())
}
log.Logger.Info(fmt.Sprintf("检查发送短信通知任务消耗时间:%.2f s", time.Since(nowTime).Seconds()))
timer.Reset(notices.interval) // 重置定时
}
}
}
// addNewSms 添加新的通知消息
func (notices *notifySms) addNewSms(newSms *domain.LogSms) error {
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return err
}
if err := transactionContext.StartTransaction(); err != nil {
return err
}
defer func() {
_ = transactionContext.RollbackTransaction()
}()
logSmsRepo := factory.CreateLogSmsRepository(map[string]interface{}{"transactionContext": transactionContext})
err = logSmsRepo.Save(newSms)
if err != nil {
return err
}
if err := transactionContext.CommitTransaction(); err != nil {
return err
}
return nil
}
// checkSendSms 检查发送短信通知
func (notices *notifySms) checkSendSms() error {
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return err
}
if err := transactionContext.StartTransaction(); err != nil {
return err
}
defer func() {
_ = transactionContext.RollbackTransaction()
}()
logSmsRepo := factory.CreateLogSmsRepository(map[string]interface{}{"transactionContext": transactionContext})
nowTime := time.Now()
nowDay := dayZeroTime(nowTime)
_, logSmsList, err := logSmsRepo.Find(map[string]interface{}{
"status": string(domain.SmsWait),
"executeAtBegin": nowDay,
"executeAtEnd": nowTime,
})
if err != nil {
return err
}
if err := transactionContext.CommitTransaction(); err != nil {
return err
}
for _, v := range logSmsList {
err = notices.sendSms(v)
if err != nil {
e := fmt.Sprintf("发送短信通知:%+v %s", *v, err)
log.Logger.Error(e)
}
}
return nil
}
// sendSms 发送短信消息
func (notices *notifySms) sendSms(param *domain.LogSms) error {
if constant.Env != "prd" {
return nil
}
//单开处理 数据保存操作,发一条短信更新一条数据
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return err
}
if err := transactionContext.StartTransaction(); err != nil {
return err
}
defer func() {
_ = transactionContext.RollbackTransaction()
}()
logSmsRepo := factory.CreateLogSmsRepository(map[string]interface{}{"transactionContext": transactionContext})
sendOk := false
sendOrNot, ok := notices.sendOrNot[param.From]
if ok {
ok, err := sendOrNot.ifSend(param.Index)
if err != nil {
param.Result = err.Error()
}
sendOk = ok
} else {
sendOk = true
}
if !sendOk {
param.Status = domain.SmsIgnore
} else {
sms := serviceGateway.SmsService{}
err = sms.SendNoticeSms(param.Phone, param.TemplateId, param.Value)
if err != nil {
param.Result = err.Error()
param.Status = domain.SmsSuccess
} else {
param.Status = domain.SmsSuccess
}
}
err = logSmsRepo.Save(param)
if err != nil {
return err
}
if err := transactionContext.CommitTransaction(); err != nil {
return err
}
return nil
}
func dayZeroTime(t time.Time) time.Time {
y, m, d := t.Local().Date()
t2 := time.Date(y, m, d, 0, 0, 0, 0, time.Local)
return t2
}
... ...
package notify
import (
"time"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/factory"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain"
)
// 每日自评短信通知
type notifyStaffAssess struct {
}
func (notices notifyStaffAssess) from() string {
return "StaffAssess"
}
// makeNotify 生成待执行的短信通知内容
func (notices notifyStaffAssess) makeNotify(param *domain.StaffAssess) *domain.LogSms {
newSms := domain.LogSms{
Id: 0,
Phone: param.Executor.Account,
TemplateId: 5475050,
Template: "您好,#name#,百忙之中不要忘记填写今天的绩效自评反馈哦",
Value: map[string]string{
"name": param.Executor.UserName,
},
Result: "",
Status: domain.SmsWait,
From: notices.from(),
Index: param.Id,
// ExecuteAt: executeAt,
CreatedAt: time.Now(),
}
// 每日自评 结束前30 分钟
// newSms.ExecuteAt = param.EndTime.Add(-1800 * time.Second)
//改为 固定在截止时间 那天的 前一天晚上10
y, m, d := param.EndTime.Local().Date()
dayTime := time.Date(y, m, d, 0, 0, 0, 0, time.Local)
newSms.ExecuteAt = dayTime.Add(-2 * time.Hour)
return &newSms
}
// ifSend 确认是否发送通知
func (notices notifyStaffAssess) ifSend(index int) (bool, error) {
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return false, err
}
if err := transactionContext.StartTransaction(); err != nil {
return false, err
}
defer func() {
_ = transactionContext.RollbackTransaction()
}()
staffAssessRepo := factory.CreateStaffAssessRepository(map[string]interface{}{"transactionContext": transactionContext})
assessData, err := staffAssessRepo.FindOne(map[string]interface{}{"id": index})
if err != nil {
return false, err
}
//还未完成评估填写,时发送短信
if assessData.Status == domain.StaffAssessUncompleted {
return true, nil
}
if err := transactionContext.CommitTransaction(); err != nil {
return false, err
}
return false, nil
}
... ...
package notify
import (
"time"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/factory"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain"
)
// 周期评估短信通知
// 条件:周期自评结束前4个小时,且还未完成评估填写
type notifySummaryEvaluation struct {
}
func (notices notifySummaryEvaluation) from() string {
return "SummaryEvaluation"
}
// makeNotify 生成待执行的短信通知内容
func (notices notifySummaryEvaluation) makeNotify(param *domain.SummaryEvaluation) *domain.LogSms {
newSms := domain.LogSms{
Id: 0,
Phone: param.Executor.Account,
TemplateId: 5536232,
Template: "您好,#name#,百忙之中不要忘记填写本月综合自评哦",
Value: map[string]string{
"name": param.Executor.UserName,
},
Result: "",
Status: domain.SmsWait,
From: notices.from(),
Index: param.Id,
// ExecuteAt: executeAt,
CreatedAt: time.Now(),
}
// 周期自评结束前4个小时,
// newSms.ExecuteAt = param.EndTime.Add(-4 * time.Hour)
//改为 固定在截止时间 那天的 前一天晚上10
y, m, d := param.EndTime.Local().Date()
dayTime := time.Date(y, m, d, 0, 0, 0, 0, time.Local)
newSms.ExecuteAt = dayTime.Add(-2 * time.Hour)
return &newSms
}
// ifSend 确认是否发送通知
func (notices notifySummaryEvaluation) ifSend(index int) (bool, error) {
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return false, err
}
if err := transactionContext.StartTransaction(); err != nil {
return false, err
}
defer func() {
_ = transactionContext.RollbackTransaction()
}()
summaryEvaluationRepo := factory.CreateSummaryEvaluationRepository(map[string]interface{}{"transactionContext": transactionContext})
summaryEvaluationData, err := summaryEvaluationRepo.FindOne(map[string]interface{}{"id": index})
if err != nil {
return false, err
}
//还未完成评估填写,时发送短信
if summaryEvaluationData.Status == domain.EvaluationUncompleted {
return true, nil
}
if err := transactionContext.CommitTransaction(); err != nil {
return false, err
}
return false, nil
}
... ...
package command
import "github.com/beego/beego/v2/core/validation"
type GetPermissionCommand struct {
CompanyId int64 `cname:"公司Id"`
}
func (in *GetPermissionCommand) Valid(*validation.Validation) {
}
... ...
package command
import (
"github.com/beego/beego/v2/core/validation"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain"
)
type UpdatePermissionCommand struct {
CompanyId int64 `cname:"公司Id"`
OptHrScore int `cname:"上级修改人资综评分数" json:"optHrScore" valid:"Required"`
OptEvalScore int `cname:"上级修改360°综评分数" json:"optEvalScore" valid:"Required"`
}
func (in *UpdatePermissionCommand) Valid(validation *validation.Validation) {
switch in.OptHrScore {
case domain.PermissionOff, domain.PermissionOn:
default:
validation.SetError("optHrScore", "修改人资综评分数参数错误")
return
}
switch in.OptEvalScore {
case domain.PermissionOff, domain.PermissionOn:
default:
validation.SetError("optEvalScore", "修改360°综评分数参数错误")
return
}
}
... ...
package service
import (
"github.com/linmadan/egglib-go/core/application"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/factory"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/permission/command"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain"
)
type PermissionService struct {
}
func NewPermissionService() *PermissionService {
newPermissionService := &PermissionService{}
return newPermissionService
}
func (rs *PermissionService) Update(in *command.UpdatePermissionCommand) (interface{}, error) {
transactionContext, err := factory.ValidateStartTransaction(in)
if err != nil {
return nil, err
}
defer func() {
transactionContext.RollbackTransaction()
}()
permissionRepository := factory.CreatePermissionRepository(map[string]interface{}{"transactionContext": transactionContext})
// 获取权限配置
_, permissions, err := permissionRepository.Find(map[string]interface{}{"companyId": in.CompanyId})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
if len(permissions) == 0 {
return nil, application.ThrowError(application.BUSINESS_ERROR, "权限配置数据错误")
}
permission := permissions[0]
permission.OptHrScore = in.OptHrScore
permission.OptEvalScore = in.OptEvalScore
permission, err = permissionRepository.Insert(permission)
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
return permission, nil
}
func (rs *PermissionService) Get(in *command.GetPermissionCommand) (interface{}, error) {
transactionContext, err := factory.ValidateStartTransaction(in)
if err != nil {
return nil, err
}
defer func() {
transactionContext.RollbackTransaction()
}()
permissionRepository := factory.CreatePermissionRepository(map[string]interface{}{"transactionContext": transactionContext})
// 获取权限配置
_, permissions, err := permissionRepository.Find(map[string]interface{}{"companyId": in.CompanyId})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
var permission *domain.Permission
if len(permissions) == 0 { // 不存在时,新增权限配置
value := &domain.Permission{
Id: 0,
CompanyId: in.CompanyId,
OptHrScore: domain.PermissionOff,
OptEvalScore: domain.PermissionOff,
}
permission, err = permissionRepository.Insert(value)
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
} else {
permission = permissions[0]
}
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
return permission, nil
}
... ...
package service
import (
"strconv"
"github.com/linmadan/egglib-go/core/application"
"github.com/linmadan/egglib-go/utils/tool_funs"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/factory"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/role/command"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain"
"strconv"
)
type RoleUserService struct {
... ... @@ -113,3 +114,33 @@ func (rs *RoleUserService) ListRole(in *command.UserRoleQueryCommand) (interface
}
return tool_funs.SimpleWrapGridMap(total, tempList), nil
}
// GetHRBP 当前操作人是否拥有HRBP权限
// 返回 1 是 表示具有hrbp 权限
func GetHRBP(transactionContext application.TransactionContext, companyId int, operatorId int) (int, error) {
roleRepo := factory.CreateRoleRepository(map[string]interface{}{"transactionContext": transactionContext})
roleUserRepo := factory.CreateRoleUserRepository(map[string]interface{}{"transactionContext": transactionContext})
_, roleList, err := roleRepo.Find(map[string]interface{}{"type": domain.RoleTypeSystem, "companyId": companyId})
if err != nil {
return -1, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取角色信息列表"+err.Error())
}
_, userRoleList, err := roleUserRepo.Find(map[string]interface{}{"companyId": companyId, "userId": operatorId})
if err != nil {
return -1, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取用户的角色信息列表"+err.Error())
}
// 拥有HRBP权限
hrbp := -1
for _, v := range userRoleList {
for _, v2 := range roleList {
if v.RoleId == v2.Id {
hrbp = 1
break
}
}
if hrbp == 1 {
break
}
}
return hrbp, nil
}
... ...
package query
type AssessSelfListQuery struct {
UserId int `json:"userId"` //用户id
CompanyId int `json:"companyId"` //公司Id
UserId int `json:"userId,string"` //用户id
CompanyId int `json:"-"` //公司Id
PageSize int `json:"pageSize"` //每页的记录数
PageNumber int `json:"pageNumber"` //页码
}
... ...
... ... @@ -32,29 +32,29 @@ func (h *HeaderLevel) addChild(name string) (child *HeaderLevel) {
}
// 获取表头的所有列表名
func (h *HeaderLevel) collectAllColumn(all *[][]string) {
for _, v := range h.Child {
v.collectColumn(&v, all, nil)
}
}
func (h *HeaderLevel) collectColumn(child *HeaderLevel, columns *[][]string, column *[]string) {
if column == nil {
column = &[]string{}
}
*column = append(*column, h.Name)
for _, v := range child.Child {
if len(v.Child) > 0 {
v.collectColumn(&v, columns, column)
}
if len(v.Child) == 0 {
item := make([]string, len(*column))
copy(item, *column)
item = append(item, v.Name)
*columns = append(*columns, item)
}
}
}
// func (h *HeaderLevel) collectAllColumn(all *[][]string) {
// for _, v := range h.Child {
// v.collectColumn(&v, all, nil)
// }
// }
// func (h *HeaderLevel) collectColumn(child *HeaderLevel, columns *[][]string, column *[]string) {
// if column == nil {
// column = &[]string{}
// }
// *column = append(*column, h.Name)
// for _, v := range child.Child {
// if len(v.Child) > 0 {
// v.collectColumn(&v, columns, column)
// }
// if len(v.Child) == 0 {
// item := make([]string, len(*column))
// copy(item, *column)
// item = append(item, v.Name)
// *columns = append(*columns, item)
// }
// }
// }
type exportData struct {
userName []string //员工的名称列表 ,对应excel文件的多个sheet
... ... @@ -156,9 +156,9 @@ func (e *exportData) weightDesc(weight float64) string {
}
}
func (e *exportData) userDayKey(userName string) string {
return userName
}
// func (e *exportData) userDayKey(userName string) string {
// return userName
// }
type exportData2 struct {
tableHeader HeaderLevel //数据表格对应表头
... ...
... ... @@ -9,6 +9,7 @@ import (
"github.com/linmadan/egglib-go/core/application"
"github.com/linmadan/egglib-go/utils/tool_funs"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/factory"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/notify"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/staff_assess/adapter"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/staff_assess/command"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/staff_assess/query"
... ... @@ -53,197 +54,6 @@ func (srv StaffAssessServeice) getHRBP(transactionContext application.Transactio
return hrbp, nil
}
// 获取我参与过的评估任务列表
// func (srv StaffAssessServeice) SearchAssessTaskMe(param *query.SearchAssessMeQuery) (map[string]interface{}, error) {
// transactionContext, err := factory.CreateTransactionContext(nil)
// if err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
// }
// if err := transactionContext.StartTransaction(); err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
// }
// defer func() {
// _ = transactionContext.RollbackTransaction()
// }()
// staffAssessTaskRepo := dao.NewStaffAssessDao(map[string]interface{}{
// "transactionContext": transactionContext,
// })
// var limit int = 200
// var offset int = 0
// if param.PageSize > 0 {
// limit = param.PageSize
// }
// offset = (param.PageNumber - 1) * param.PageSize
// assessTaskList, err := staffAssessTaskRepo.SearchAssessTaskMe(param.UserId, param.CompanyId, limit, offset)
// if err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "查询评估任务"+err.Error())
// }
// cnt, err := staffAssessTaskRepo.CountAssessTaskMe(param.UserId, param.CompanyId)
// if err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "查询评估任务"+err.Error())
// }
// if err := transactionContext.CommitTransaction(); err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
// }
// listData := make([]adapter.SearchAssessMeResp, 0, len(assessTaskList))
// var temp adapter.SearchAssessMeResp
// for _, v := range assessTaskList {
// temp = adapter.SearchAssessMeResp{
// AssessTaskId: v.Id,
// BeginTime: v.BeginTime.Local().Format("2006-01-02 15:04:05"),
// EndTime: v.EndTime.Local().Format("2006-01-02 15:04:05"),
// CycleId: v.CycleId,
// CycleName: v.CycleName,
// EvaluationProjectId: v.EvaluationProjectId,
// EvaluationProjectName: v.EvaluationProjectName,
// }
// listData = append(listData, temp)
// }
// return tool_funs.SimpleWrapGridMap(int64(cnt), listData), nil
// }
// 获取项目评估进度描述
// func (srv StaffAssessServeice) AssessTaskDesc(param *query.AssessTaskDescQuery) (*adapter.AssessTaskDescResp, error) {
// transactionContext, err := factory.CreateTransactionContext(nil)
// if err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
// }
// if err := transactionContext.StartTransaction(); err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
// }
// defer func() {
// _ = transactionContext.RollbackTransaction()
// }()
// // 获取评估任务
// staffAssessTaskRepo := factory.CreateStaffAssessTaskRepository(map[string]interface{}{
// "transactionContext": transactionContext,
// })
// //获取个人参与的评估流程
// staffAssessRepo := factory.CreateStaffAssessRepository(map[string]interface{}{
// "transactionContext": transactionContext,
// })
// assessTaskData, err := staffAssessTaskRepo.FindOne(map[string]interface{}{
// "id": param.AssessTaskId,
// })
// if err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, "评估任务不存在,"+err.Error())
// }
// //返回的数据结果
// result := adapter.AssessTaskDescResp{
// AssessTaskId: assessTaskData.Id,
// EvaluationProjectId: assessTaskData.EvaluationProjectId,
// EvaluationProjectName: assessTaskData.EvaluationProjectName,
// CycleName: assessTaskData.CycleName,
// BeginTime: assessTaskData.BeginTime.Local().Format("2006-01-02 15:04-05"),
// EndTime: assessTaskData.EndTime.Local().Format("2006-01-02 15:04-05"),
// StepList: []adapter.AssessTaskStep{},
// }
// for _, v := range assessTaskData.StepList {
// stepItem := adapter.AssessTaskStep{
// SortBy: v.SortBy,
// LinkNodeName: v.LinkNodeName,
// LinkNodeId: v.LinkNodeId,
// BeginTime: v.BeginTime.Local().Format("2006-01-02 15:04:05"),
// EndTime: v.EndTime.Local().Format("2006-01-02 15:04:05"),
// LinkNodeType: v.LinkNodeType,
// Desc: fmt.Sprintf("截止日期:%s", v.EndTime.Local().Format("2006-01-02 15:04:05")),
// Status: "",
// }
// switch v.LinkNodeType {
// case domain.LinkNodeSelfAssessment:
// //个人自评完成情况
// _, assessSelfData, err := staffAssessRepo.Find(map[string]interface{}{
// "staffAssessTaskId": assessTaskData.Id,
// "executorId": param.UserId,
// "typesList": []string{string(domain.AssessSelf)},
// })
// if err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, "获取个人的评估环节"+err.Error())
// }
// if len(assessSelfData) > 0 {
// stepItem.Status = string(assessSelfData[0].Status)
// }
// stepItem.Desc = fmt.Sprintf("截止日期:%s", stepItem.EndTime)
// case domain.LinkNodeAllInvite:
// //邀请别人评估自己
// _, assessInviteData, err := staffAssessRepo.Find(map[string]interface{}{
// "staffAssessTaskId": assessTaskData.Id,
// "targetUserId": param.UserId,
// "typesList": []string{string(domain.AssessInviteDiffSuper), string(domain.AssessInviteSameSuper)},
// "limit": 5,
// })
// if err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, "获取个人的评估环节"+err.Error())
// }
// if len(assessInviteData) > 0 {
// stepItem.Status = string(domain.StaffAssessCompleted)
// } else {
// stepItem.Status = string(domain.StaffAssessUncompleted)
// }
// //待邀请人数,为5人减去已邀请的人数。若邀请人数已等于或大于5人,则只显示截止日期即可
// if len(assessInviteData) > 5 {
// stepItem.Desc = fmt.Sprintf("截止日期:%s", stepItem.EndTime)
// } else {
// stepItem.Desc = fmt.Sprintf("截止日期:%s 待邀请%d人", stepItem.EndTime, 5-len(assessInviteData))
// }
// case domain.LinkNodeAllAssessment:
// //我评估别人,被邀请评估
// _, assessInviteList, err := staffAssessRepo.Find(map[string]interface{}{
// "staffAssessTaskId": assessTaskData.Id,
// "executorId": param.UserId,
// "typesList": []string{string(domain.AssessInviteDiffSuper), string(domain.AssessInviteSameSuper)},
// })
// if err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, "获取个人的评估环节"+err.Error())
// }
// if len(assessInviteList) > 0 {
// stepItem.Status = string(domain.StaffAssessCompleted)
// stepItem.Desc = fmt.Sprintf("截止日期:%s", stepItem.EndTime)
// for _, v := range assessInviteList {
// if v.Status == domain.StaffAssessUncompleted {
// stepItem.Status = string(domain.StaffAssessUncompleted)
// break
// }
// }
// }
// case domain.LinkNodeSuperiorAssessment:
// //我评估别人,上级评估
// _, assessSupperList, err := staffAssessRepo.Find(map[string]interface{}{
// "staffAssessTaskId": assessTaskData.Id,
// "executorId": param.UserId,
// "typesList": []string{string(domain.AssessSuper)},
// })
// if err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, "获取个人的评估环节"+err.Error())
// }
// if len(assessSupperList) > 0 {
// stepItem.Status = string(domain.StaffAssessCompleted)
// stepItem.Desc = fmt.Sprintf("截止日期:%s", stepItem.EndTime)
// uncompletedNum := 0
// for _, v := range assessSupperList {
// if v.Status == domain.StaffAssessUncompleted {
// uncompletedNum += 1
// }
// }
// if uncompletedNum > 0 {
// stepItem.Status = string(domain.StaffAssessUncompleted)
// stepItem.Desc = fmt.Sprintf("截止日期:%s 待评估%d人", stepItem.EndTime, uncompletedNum)
// }
// }
// }
// result.StepList = append(result.StepList, stepItem)
// }
// if err := transactionContext.CommitTransaction(); err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
// }
// return &result, nil
// }
// 获取个人的自评反馈历史记录列表
func (srv StaffAssessServeice) AssessSelfList(param *query.AssessSelfListQuery) (map[string]interface{}, error) {
transactionContext, err := factory.CreateTransactionContext(nil)
... ... @@ -451,10 +261,11 @@ func (srv StaffAssessServeice) CreateStaffAssessTask(transactionContext applicat
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "保存个人评估项"+err.Error())
}
if assessList[i].Types == domain.AssessSelf {
//添加待发送的短信通知
notify.AddNotifyStaffAssess(&assessList[i])
}
}
//处理生成的项目评估
return map[string]interface{}{
"assessTaskId": assessTaskData.Id,
}, nil
... ... @@ -925,93 +736,6 @@ func (srv StaffAssessServeice) SaveAssessInviteUser(param *command.SaveAssessInv
return result, nil
}
// 获取员工自评的评估内容详情
// func (srv StaffAssessServeice) GetAssessSelfInfo(param *query.AssessSelfInfoQuery) (*adapter.AssessInfoResp, error) {
// transactionContext, err := factory.CreateTransactionContext(nil)
// if err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
// }
// if err := transactionContext.StartTransaction(); err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
// }
// defer func() {
// _ = transactionContext.RollbackTransaction()
// }()
// assessReps := factory.CreateStaffAssessRepository(map[string]interface{}{
// "transactionContext": transactionContext,
// })
// //获取员工的评估
// _, assessList, err := assessReps.Find(map[string]interface{}{
// "companyId": param.CompanyId,
// "staffAssessTaskId": param.AssessTaskId,
// "targetUserId": param.TargetUserId,
// "typesList": []string{string(domain.AssessSelf)},
// })
// if err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取员工的评估"+err.Error())
// }
// if len(assessList) == 0 {
// return &adapter.AssessInfoResp{}, nil
// }
// assessData := assessList[0]
// assessContentList := []*domain.StaffAssessContent{}
// if assessData.Status == domain.StaffAssessCompleted {
// //已完成
// assessContentRepo := factory.CreateStaffAssessContentRepository(map[string]interface{}{
// "transactionContext": transactionContext,
// })
// _, assessContentList, err = assessContentRepo.Find(map[string]interface{}{
// "staffAssessId": assessData.Id,
// })
// if err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取项目填写内容"+err.Error())
// }
// } else if assessData.Status == domain.StaffAssessUncompleted {
// //未完成
// assessContentList, err = srv.getAssessSelfInfoUncompleted(transactionContext, assessData)
// if err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取项目填写内容"+err.Error())
// }
// }
// // 恢复缓存数据
// if param.AcquireCache != 0 {
// srv.recoverAssessCache(transactionContext, assessData.Id, assessContentList)
// }
// //获取员工描述
// staffDesc, _ := srv.getStaffDescrip(transactionContext, int64(param.TargetUserId))
// if err := transactionContext.CommitTransaction(); err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
// }
// result := adapter.AssessInfoResp{
// AssessId: assessData.Id,
// CycleId: assessData.CycleId,
// CycleName: assessData.CycleName,
// LinkNodeId: assessData.LinkNodeId,
// LinkNodeName: assessData.LinkNodeName,
// EvaluationProjectId: assessData.EvaluationProjectId,
// EvaluationProjectName: assessData.EvaluationProjectName,
// BeginTime: assessData.BeginTime.Local().Format("2006-01-02 15:04:05"),
// EndTime: assessData.EndTime.Local().Format("2006-01-02 15:04:05"),
// Status: string(assessData.Status),
// TargetUserId: assessData.TargetUser.UserId,
// TargetUserName: assessData.TargetUser.UserName,
// CompanyId: assessData.CompanyId,
// CompanyName: "",
// SupperUser: "",
// DutyTime: "",
// AssessContent: assessContentList,
// }
// if staffDesc != nil {
// result.CompanyName = staffDesc.CompanyName
// result.SupperUser = staffDesc.SupperUserName
// result.DutyTime = staffDesc.DutyTime
// }
// return &result, nil
// }
// 获取未完成的员工评估内容
func (srv StaffAssessServeice) getAssessSelfInfoUncompleted(transactionContext application.TransactionContext,
assess *domain.StaffAssess) ([]*domain.StaffAssessContent, error) {
... ... @@ -1105,426 +829,6 @@ func (srv StaffAssessServeice) getAssessSelfInfoUncompleted(transactionContext a
return contentList, nil
}
// 选择员工评估可邀请的用户
func (srv StaffAssessServeice) SelectAssessInviteUser(param *query.SelectAssessInviteUser) (map[string]interface{}, error) {
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
if err := transactionContext.StartTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
defer func() {
_ = transactionContext.RollbackTransaction()
}()
//获取被评估的目标用户
userRepo := factory.CreateUserRepository(map[string]interface{}{
"transactionContext": transactionContext,
})
//获取公司信息
companyRepo := factory.CreateCompanyRepository(map[string]interface{}{
"transactionContext": transactionContext,
})
companyInfo, _ := companyRepo.FindOne(map[string]interface{}{
"id": param.CompanyId,
})
targetUser, err := userRepo.FindOne(map[string]interface{}{
"id": param.TargetUserId,
})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取员工信息"+err.Error())
}
//获取被评估的目标用户的部门
departmentRepo := factory.CreateDepartmentRepository(map[string]interface{}{
"transactionContext": transactionContext,
})
var targetUserDepartment []*domain.Department
if len(targetUser.DepartmentId) > 0 {
_, targetUserDepartment, err = departmentRepo.Find(map[string]interface{}{
"ids": targetUser.DepartmentId,
})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取部门信息"+err.Error())
}
}
//获取部门主管的id
targetUserCharge := map[int64]struct{}{}
for _, v := range targetUserDepartment {
for _, vv := range v.ChargeUserIds {
targetUserCharge[vv] = struct{}{}
}
}
//
targetUserDepartmentMap := map[int64]struct{}{}
for _, v := range targetUserDepartment {
targetUserDepartmentMap[v.Id] = struct{}{}
}
//查询员工数据
condition := map[string]interface{}{
"companyId": param.CompanyId,
"name": param.InviteUserName,
"limit": 20,
"status": 1,
}
if param.PageSize > 0 {
condition["limit"] = param.PageSize
}
offset := (param.PageNumber - 1) * param.PageSize
if offset > 0 {
condition["offset"] = offset
}
cnt, userList, err := userRepo.Find(condition)
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取员工列表信息"+err.Error())
}
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
listData := []adapter.SelectInviteUser{}
companyName := ""
if companyInfo != nil {
companyName = companyInfo.Name
}
for _, v := range userList {
item := adapter.SelectInviteUser{
UserId: int(v.Id),
UserName: v.Name,
CompanyName: companyName,
IsSupper: false,
Types: 2, //默认是不同上级
}
if _, ok := targetUserCharge[v.Id]; ok {
item.IsSupper = true
}
for _, vv := range v.DepartmentId {
if _, ok := targetUserDepartmentMap[int64(vv)]; ok {
item.Types = 1 //设为相同上级
break
}
}
listData = append(listData, item)
}
return tool_funs.SimpleWrapGridMap(int64(cnt), listData), nil
}
// 获取我要执行的的360评估,用户列表和评估填写的值
// func (srv StaffAssessServeice) ListExecutorInviteAssess(param *query.ListInviteUserAssessQuery) (
// *adapter.ListInviteUserAssessResp, error) {
// transactionContext, err := factory.CreateTransactionContext(nil)
// if err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
// }
// if err := transactionContext.StartTransaction(); err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
// }
// defer func() {
// _ = transactionContext.RollbackTransaction()
// }()
// //获取对应的评估任务
// assessRepo := factory.CreateStaffAssessRepository(map[string]interface{}{
// "transactionContext": transactionContext,
// })
// assessTaskRepo := factory.CreateStaffAssessTaskRepository(map[string]interface{}{
// "transactionContext": transactionContext,
// })
// //获取 executorId 对应的360评估任务 用户
// condition := map[string]interface{}{
// "staffAssessTaskId": param.AssessTaskId,
// "executorId": param.ExecutorId,
// "typesList": []string{string(domain.AssessInviteDiffSuper), string(domain.AssessInviteSameSuper)},
// "limit": 20,
// }
// if param.PageSize > 0 {
// condition["limit"] = param.PageSize
// }
// offset := (param.PageNumber - 1) * param.PageSize
// if offset > 0 {
// condition["offset"] = offset
// }
// cnt, assessList, err := assessRepo.Find(condition)
// if err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
// }
// var assessContentList []*domain.StaffAssessContent
// if len(assessList) > 0 {
// //获取评估用的所有评估项
// assessContentList, err = srv.getAssessSelfInfoUncompleted(transactionContext, assessList[0])
// if err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取评估任务"+err.Error())
// }
// }
// //可变的表格列
// changeableHeader := []adapter.ListTableHeader{}
// //列名与字段对应
// keyMap := map[string]string{}
// for i, v := range assessContentList {
// name := fmt.Sprintf("%s-%s", v.Category, v.Name)
// key := fmt.Sprintf("k%d", i)
// keyMap[name] = key
// changeableHeader = append(changeableHeader, adapter.ListTableHeader{
// Key: key,
// Name: name,
// })
// }
// assessContentRepo := factory.CreateStaffAssessContentRepository(map[string]interface{}{
// "transactionContext": transactionContext,
// })
// // 获取已经填报的内容
// changeableRows := map[int]map[string]string{}
// for _, v := range assessList {
// _, contentList, err := assessContentRepo.Find(map[string]interface{}{
// "staffAssessId": v.Id,
// })
// if err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取评估内容"+err.Error())
// }
// row := map[string]string{}
// for _, vv := range contentList {
// name := fmt.Sprintf("%s-%s", vv.Category, vv.Name)
// if kk, ok := keyMap[name]; ok {
// row[kk] = vv.Value
// }
// }
// changeableRows[v.TargetUser.UserId] = row
// }
// //获取360邀请评估完成情况
// //我评估别人,被邀请评估
// cnnt, _, err := assessRepo.Find(map[string]interface{}{
// "staffAssessTaskId": param.AssessTaskId,
// "executorId": param.ExecutorId,
// "typesList": []string{string(domain.AssessInviteDiffSuper), string(domain.AssessInviteSameSuper)},
// "status": domain.StaffAssessUncompleted,
// })
// if err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, "获取个人的评估环节"+err.Error())
// }
// assessTaskData, err := assessTaskRepo.FindOne(map[string]interface{}{
// "id": param.AssessTaskId,
// })
// if err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, "获取评估任务"+err.Error())
// }
// if err := transactionContext.CommitTransaction(); err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
// }
// //评估填写数据行转列
// tableHeader := []adapter.ListTableHeader{
// {Key: "userName", Name: "姓名"},
// {Key: "status", Name: "状态"},
// {Key: "types", Name: "360°评估关系"},
// {Key: "endTime", Name: "360°评估截止日期"},
// }
// tableHeader = append(tableHeader, changeableHeader...)
// listData := []map[string]interface{}{}
// for _, v := range assessList {
// m := map[string]interface{}{
// "userName": v.TargetUser.UserName,
// "userId": strconv.Itoa(v.TargetUser.UserId),
// "status": string(v.Status),
// "types": string(v.Types),
// "endTime": v.EndTime.Local().Format("2006-01-02 15:04:05"),
// "assessId": strconv.Itoa(v.Id),
// }
// switch v.Status {
// case domain.StaffAssessCompleted:
// m["status"] = "已经完成"
// case domain.StaffAssessUncompleted:
// m["status"] = "未完成"
// }
// switch v.Types {
// case domain.AssessInviteDiffSuper:
// m["types"] = "不同上级同事"
// case domain.AssessInviteSameSuper:
// m["types"] = "相同上级同事"
// }
// if row, ok := changeableRows[v.TargetUser.UserId]; ok {
// for k, v := range row {
// m[k] = v
// }
// } else {
// for _, v := range changeableHeader {
// m[v.Key] = ""
// }
// }
// listData = append(listData, m)
// }
// result := adapter.ListInviteUserAssessResp{
// TableHeader: tableHeader,
// List: listData,
// Total: cnt,
// }
// for _, v := range assessTaskData.StepList {
// if v.LinkNodeType == domain.LinkNodeAllAssessment {
// result.LinkNodeId = v.LinkNodeId
// result.LinkNodeName = v.LinkNodeName
// result.LintNodeDesc = fmt.Sprintf("截止时间 %s 待评估%d人", v.EndTime.Local().Format("2006-01-02 15:04:05"), cnnt)
// }
// }
// return &result, nil
// }
// 获取我需要执行的上级评估成员列表
// func (srv StaffAssessServeice) ListExecutorSupperAssess(param *query.ListSupperAssessQuery) (map[string]interface{}, error) {
// transactionContext, err := factory.CreateTransactionContext(nil)
// if err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
// }
// if err := transactionContext.StartTransaction(); err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
// }
// defer func() {
// _ = transactionContext.RollbackTransaction()
// }()
// //获取对应的评估任务
// assessRepo := factory.CreateStaffAssessRepository(map[string]interface{}{
// "transactionContext": transactionContext,
// })
// limit := 20
// if param.PageSize > 0 {
// limit = param.PageSize
// }
// condition := map[string]interface{}{
// "staffAssessTaskId": param.AssessTaskId,
// "executorId": param.ExecutorId,
// "typesList": []string{string(domain.AssessSuper)},
// "limit": limit,
// "targetUserName": param.UserName,
// }
// offset := (param.PageNumber - 1) * param.PageSize
// if offset > 0 {
// condition["offset"] = offset
// }
// //获取 executorId 对应的上级评估列表
// cnt, assessList, err := assessRepo.Find(condition)
// if err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
// }
// userIds := []int{}
// for _, v := range assessList {
// userIds = append(userIds, v.TargetUser.UserId)
// }
// //获取员工信息
// userRepo := factory.CreateUserRepository(map[string]interface{}{
// "transactionContext": transactionContext,
// })
// var targetUserList []*domain.User
// if len(userIds) > 0 {
// _, targetUserList, _ = userRepo.Find(map[string]interface{}{
// "ids": userIds,
// })
// }
// //获取职位信息
// positionRepo := factory.CreatePositionRepository(map[string]interface{}{
// "transactionContext": transactionContext,
// })
// //获取员工的职位
// userPositionMap := map[int64][]*domain.Position{}
// for _, v := range targetUserList {
// if len(v.PositionId) == 0 {
// continue
// }
// _, positionList, _ := positionRepo.Find(map[string]interface{}{
// "ids": v.PositionId,
// })
// userPositionMap[v.Id] = positionList
// }
// //获取员工邀请的人完成360评估的数量
// var inviteCompletedCount []dao.CountData
// if len(userIds) > 0 {
// d := dao.NewStaffAssessDao(map[string]interface{}{
// "transactionContext": transactionContext,
// })
// inviteCompletedCount, err = d.CountInviteAssessByTargetUser(userIds, param.AssessTaskId)
// if err != nil {
// log.Logger.Error("获取员工邀请的人完成情况" + err.Error())
// }
// }
// assessTaskRepo := factory.CreateStaffAssessTaskRepository(map[string]interface{}{
// "transactionContext": transactionContext,
// })
// assessTaskData, err := assessTaskRepo.FindOne(map[string]interface{}{
// "id": param.AssessTaskId,
// })
// if err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, "获取评估任务"+err.Error())
// }
// //我评估别人,被邀请评估
// cnnt, _, err := assessRepo.Find(map[string]interface{}{
// "staffAssessTaskId": param.AssessTaskId,
// "executorId": param.ExecutorId,
// "typesList": []string{string(domain.AssessSuper)},
// "status": string(domain.StaffAssessUncompleted),
// })
// if err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, "获取个人的评估环节"+err.Error())
// }
// if err := transactionContext.CommitTransaction(); err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
// }
// resultList := []adapter.ListSupperAssessResp{}
// for _, v := range assessList {
// item := adapter.ListSupperAssessResp{
// AssessId: v.Id,
// UserId: v.TargetUser.UserId,
// UserName: v.TargetUser.UserName,
// EndTime: v.EndTime.Local().Format("2006-01-02 15:04:05"),
// InviteCompleted: 0,
// Status: string(v.Status),
// InviteTotal: 5,
// Department: "",
// Position: "",
// DutyTime: "",
// }
// //填入部门
// for _, vv := range v.TargetDepartment {
// item.Department += vv.DepartmentName + " "
// }
// for _, vv := range targetUserList {
// if vv.Id != int64(v.TargetUser.UserId) {
// continue
// }
// //填入入职时间
// item.DutyTime = vv.CreatedAt.Local().Format("2006-01-02 15:04:05")
// //填入职位
// for _, vvv := range userPositionMap[vv.Id] {
// item.Position += vvv.Name + " "
// }
// break
// }
// //
// for _, vv := range inviteCompletedCount {
// if v.TargetUser.UserId == vv.TargetUserId {
// item.InviteCompleted = vv.InviteCompleted
// item.InviteTotal = vv.InviteTotal
// break
// }
// }
// resultList = append(resultList, item)
// }
// result := tool_funs.SimpleWrapGridMap(int64(cnt), resultList)
// result["linkNodeName"] = ""
// result["linkNodeId"] = ""
// result["lintNodeDesc"] = ""
// for _, v := range assessTaskData.StepList {
// if v.LinkNodeType == domain.LinkNodeSuperiorAssessment {
// result["linkNodeName"] = v.LinkNodeName
// result["linkNodeId"] = fmt.Sprintf("%d", v.LinkNodeId)
// result["lintNodeDesc"] = fmt.Sprintf("截止时间 %s 待评估 %d 人", v.EndTime.Local().Format("2006-01-02 15:04:05"), cnnt)
// }
// }
// return result, nil
// }
// 根据staffAssessId 获取评估的填写信息
func (srv StaffAssessServeice) GetAssessInfo(param *query.AssessInfoQuery) (*adapter.AssessInfoResp, error) {
transactionContext, err := factory.CreateTransactionContext(nil)
... ... @@ -1777,126 +1081,22 @@ func (srv StaffAssessServeice) SaveAssessInfo(param *command.SaveAssessInfoComma
}, nil
}
// 获取员工被评估的列表
// func (srv StaffAssessServeice) ListTargetUserAssess(param *query.ListTargetUserAssessQuery) (map[string]interface{}, error) {
// transactionContext, err := factory.CreateTransactionContext(nil)
// if err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
// }
// if err := transactionContext.StartTransaction(); err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
// }
// defer func() {
// _ = transactionContext.RollbackTransaction()
// }()
// assessReps := factory.CreateStaffAssessRepository(map[string]interface{}{
// "transactionContext": transactionContext,
// })
// //获取员工的评估
// cnt, assessList, err := assessReps.Find(map[string]interface{}{
// "staffAssessTaskId": param.AssessTaskId,
// "companyId": param.CompanyId,
// "targetUserId": param.TargetUserId,
// "typesList": param.Types,
// })
// if err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取员工的评估"+err.Error())
// }
// if err := transactionContext.CommitTransaction(); err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
// }
// return tool_funs.SimpleWrapGridMap(int64(cnt), assessList), nil
// }
// 获取员工的上级是谁
func (srv StaffAssessServeice) getStaffSuper(transactionContext application.TransactionContext, targetUser domain.User) ([]*domain.User, error) {
departmentRepo := factory.CreateDepartmentRepository(map[string]interface{}{
"transactionContext": transactionContext,
})
userRepo := factory.CreateUserRepository(map[string]interface{}{
"transactionContext": transactionContext,
})
var departmemtList []*domain.Department
var err error
if len(targetUser.DepartmentId) > 0 {
_, departmemtList, err = departmentRepo.Find(map[string]interface{}{
"ids": targetUser.DepartmentId,
})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取员工的部门列表"+err.Error())
}
if targetUser.ParentId == 0 {
return nil, nil
}
if len(departmemtList) == 0 {
//找不到员工的部门
companyRepo := factory.CreateCompanyRepository(map[string]interface{}{
userRepo := factory.CreateUserRepository(map[string]interface{}{
"transactionContext": transactionContext,
})
companyData, err := companyRepo.FindOne(map[string]interface{}{
"id": targetUser.CompanyId,
})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取员工的公司"+err.Error())
}
//公司作为最顶级
departmemtList = append(departmemtList, &domain.Department{
Id: 0,
CompanyId: companyData.Id,
Level: 0,
Name: companyData.Name,
ParentId: 0,
ChargeUserIds: companyData.ChargeUserIds,
Path: "",
CreatedAt: time.Time{},
UpdatedAt: time.Time{},
DeletedAt: &time.Time{},
})
}
//获取部门管理员
var chargeUserIds []int64
var targetUserAsManager *domain.Department
loop:
for _, v := range departmemtList {
if len(v.ChargeUserIds) == 0 {
continue
}
//检查员工自身是否是管理员
for _, vv := range v.ChargeUserIds {
if vv == targetUser.Id {
targetUserAsManager = v
break loop
}
}
chargeUserIds = append(chargeUserIds, v.ChargeUserIds...)
}
if targetUserAsManager != nil {
//清空原有的管理员
chargeUserIds = []int64{}
//员工自身是否是管理员,查找父级部门
_, parentDepartment, err := departmentRepo.Find(map[string]interface{}{
"id": targetUserAsManager.ParentId,
})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取员工现在部门的父级"+err.Error())
}
for _, v := range parentDepartment {
chargeUserIds = append(chargeUserIds, v.ChargeUserIds...)
}
}
var chargeUserList []*domain.User
if len(chargeUserIds) > 0 {
_, chargeUserList, err = userRepo.Find(map[string]interface{}{
"ids": chargeUserIds,
"status": 1, //正常的用户
userData, err := userRepo.FindOne(map[string]interface{}{
"id": targetUser.ParentId,
})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取主管员工数据"+err.Error())
}
return nil, err
}
return chargeUserList, nil
return []*domain.User{userData}, nil
}
func (srv StaffAssessServeice) recoverAssessCache(context application.TransactionContext, assessId int, dataArray []*domain.StaffAssessContent) {
... ...
... ... @@ -2,6 +2,9 @@ package service
import (
"fmt"
"strconv"
"strings"
"github.com/linmadan/egglib-go/core/application"
"github.com/linmadan/egglib-go/utils/tool_funs"
"github.com/xuri/excelize/v2"
... ... @@ -11,31 +14,29 @@ import (
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/staff_assess/query"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/infrastructure/dao"
"strconv"
"strings"
)
// 调试用,手动调用CreateStaffAssessTask
func (srv StaffAssessServeice) InvokCreateStaffAssessTask(param *command.CreateStaffAssessTask) (map[string]interface{}, error) {
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
if err := transactionContext.StartTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
defer func() {
_ = transactionContext.RollbackTransaction()
}()
// transactionContext, err := factory.CreateTransactionContext(nil)
// if err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
// }
// if err := transactionContext.StartTransaction(); err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
// }
// defer func() {
// _ = transactionContext.RollbackTransaction()
// }()
data, err := srv.CreateStaffAssessTask(transactionContext, param)
if err != nil {
return nil, err
}
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
return data, nil
// data, err := srv.CreateStaffAssessTask(transactionContext, param)
// if err != nil {
// return nil, err
// }
// if err := transactionContext.CommitTransaction(); err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
// }
return nil, nil
}
func (srv StaffAssessServeice) QuerySummary(in *query.SummaryCommand) (map[string]interface{}, error) {
... ... @@ -82,7 +83,7 @@ func (srv StaffAssessServeice) QuerySummary(in *query.SummaryCommand) (map[strin
if invite.EndTime == nil {
invite.EndTime = &d.EndTime
}
break
case domain.AssessSuper:
supper.Total++
if d.Status == domain.StaffAssessCompleted {
... ... @@ -91,7 +92,7 @@ func (srv StaffAssessServeice) QuerySummary(in *query.SummaryCommand) (map[strin
if supper.EndTime == nil {
supper.EndTime = &d.EndTime
}
break
case domain.AssessInviteDiffSuper, domain.AssessInviteSameSuper:
inviteAssess.Total++
if d.Status == domain.StaffAssessCompleted {
... ... @@ -102,7 +103,7 @@ func (srv StaffAssessServeice) QuerySummary(in *query.SummaryCommand) (map[strin
}
inviteTargetIdMap[d.TargetUserId] = 0 // 360评估类型都是被人邀请的评估,过滤相同的目标用户后,就是完成邀请的数量
break
}
}
invite.Completed = len(inviteTargetIdMap)
... ...
... ... @@ -91,38 +91,6 @@ func (srv StaffAssessServeice) ListUserAssessContentCycleDay(param *query.ListAs
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
//roleRepo := factory.CreateRoleRepository(map[string]interface{}{
// "transactionContext": transactionContext,
//})
//roleUserRepo := factory.CreateRoleUserRepository(map[string]interface{}{
// "transactionContext": transactionContext,
//})
//_, roleList, err := roleRepo.Find(map[string]interface{}{
// "type": domain.RoleTypeSystem,
// "companyId": param.CompanyId,
//})
//if err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取角色信息列表"+err.Error())
//}
//_, userRoleList, err := roleUserRepo.Find(map[string]interface{}{
// "companyId": param.CompanyId,
// "userId": param.OperaterId,
//})
//if err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取用户的角色信息列表"+err.Error())
//}
//hrbp := -1
//for _, v := range userRoleList {
// for _, v2 := range roleList {
// if v.RoleId == v2.Id {
// hrbp = 1
// break
// }
// }
// if hrbp == 1 {
// break
// }
//}
assessDao := dao.NewStaffAssessDao(map[string]interface{}{
"transactionContext": transactionContext,
})
... ... @@ -209,224 +177,6 @@ func (srv StaffAssessServeice) ListUserAssessContentCycleDay(param *query.ListAs
return &result, nil
}
// func (srv StaffAssessServeice) ExportUserAssess(param *query.ExportAssessContentCycleDay) (*excelize.File, error) {
// transactionContext, err := factory.CreateTransactionContext(nil)
// if err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
// }
// if err := transactionContext.StartTransaction(); err != nil {
// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
// }
// defer func() {
// _ = transactionContext.RollbackTransaction()
// }()
// hrbp, err := srv.getHRBP(transactionContext, param.CompanyId, param.OperaterId)
// if err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
// }
// assessDao := dao.NewStaffAssessDao(map[string]interface{}{
// "transactionContext": transactionContext,
// })
// contentList, err := assessDao.ExportDataUserAssess(dao.SearchConditin1{
// CompanyId: param.CompanyId,
// CycleId: param.CycleId,
// BeginDay: param.BeginDay,
// TargetUserName: param.TargetUserName,
// TargetUserId: param.TargetUserId,
// Limit: 5000,
// Offset: 0,
// OperaterId: param.OperaterId,
// Hrbp: hrbp,
// })
// if err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取数据列表"+err.Error())
// }
// if err := transactionContext.CommitTransaction(); err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
// }
// //选择导出的评估项
// includeCol := map[string]struct{}{}
// for _, v := range param.ExportItems {
// includeCol[v.Category+"+"+v.Name] = struct{}{}
// }
// //处理查询到的数据
// //汇总 Excel表格的表头描述
// level1 := []string{} //分类
// level3 := map[string][]string{} //key=分类+得分项类型 val=名称
// level4 := map[string]string{} //key=分类+名称 val=评估标准
// for _, v := range contentList {
// if v.ContentId == 0 {
// continue
// }
// if len(includeCol) > 0 {
// if _, ok := includeCol[v.Category+"+"+v.ContentName]; !ok {
// continue
// }
// }
// level1Item := ""
// for _, v1 := range level1 {
// if v.Category == v1 {
// level1Item = v1
// }
// }
// if len(level1Item) == 0 {
// level1 = append(level1, v.Category)
// }
// if v.Weight == 0 {
// level3Key := v.Category + "-加分项"
// if _, ok := level3[level3Key]; !ok {
// level3[level3Key] = []string{}
// }
// level3Item := ""
// for _, v3 := range level3[level3Key] {
// if v3 == v.ContentName {
// level3Item = v.ContentName
// }
// }
// if len(level3Item) == 0 {
// level3[level3Key] = append(level3[level3Key], v.ContentName)
// }
// }
// if v.Weight > 0 {
// level3Key := v.Category + "-得分项"
// if _, ok := level3[level3Key]; !ok {
// level3[level3Key] = []string{}
// }
// level3Item := ""
// for _, v3 := range level3[level3Key] {
// if v3 == v.ContentName {
// level3Item = v.ContentName
// }
// }
// if len(level3Item) == 0 {
// level3[level3Key] = append(level3[level3Key], v.ContentName)
// }
// }
// level4Key := v.Category + "+" + v.ContentName
// if _, ok := level4[level4Key]; !ok {
// level4[level4Key] = v.PromptText
// }
// }
// //汇总表头,按列
// headerList := []excelTableHeader{
// {
// Level1: "日期",
// Level2: "",
// Level3: "",
// Level4: "评估标准",
// }, {
// Level1: "姓名",
// Level2: "",
// Level3: "",
// Level4: "",
// },
// }
// for _, v := range level1 {
// item := excelTableHeader{
// Level1: v,
// }
// level3Key := v + "-加分项"
// if _, ok := level3[level3Key]; ok {
// for _, v2 := range level3[level3Key] {
// item.Level2 = "加分项"
// item.Level3 = v2
// level4Key := v + "+" + v2
// item.Level4 = level4[level4Key]
// headerList = append(headerList, item)
// }
// }
// level3Key = v + "-得分项"
// if _, ok := level3[level3Key]; ok {
// for _, v2 := range level3[level3Key] {
// item.Level2 = "得分项"
// item.Level3 = v2
// level4Key := v + "+" + v2
// item.Level4 = level4[level4Key]
// headerList = append(headerList, item)
// }
// }
// }
// //数据形式 进行 行列转换
// tableRows := map[string]map[string]string{}
// tableRowSort := []string{}
// for _, v := range contentList {
// if _, ok := tableRows[v.TargetUserId]; !ok {
// tableRows[v.TargetUserId] = map[string]string{}
// tableRowSort = append(tableRowSort, v.TargetUserId)
// }
// tableRows[v.TargetUserId]["TargetUserName"] = v.TargetUserName
// tableRows[v.TargetUserId]["BeginDay"] = v.BeginDay
// if v.ContentId > 0 {
// if len(includeCol) > 0 {
// if _, ok := includeCol[v.Category+"+"+v.ContentName]; !ok {
// continue
// }
// }
// value := []string{v.Value}
// for _, v2 := range v.Remark {
// value = append(value, v2.RemarkText)
// }
// key := v.Category + "+" + v.ContentName
// tableRows[v.TargetUserId][key] = strings.Join(value, "\n")
// }
// }
// //将数据写入xlsx
// xlsxFile := excelize.NewFile()
// sheetIndex := xlsxFile.GetActiveSheetIndex()
// sheetName := xlsxFile.GetSheetName(sheetIndex)
// //写入第一行
// xlsxFile.SetCellStr(sheetName, "A1", "每日绩效汇总")
// //写入二到五行
// for k, v := range headerList {
// colName, _ := excelize.ColumnNumberToName(k + 1)
// xlsxFile.SetCellStr(sheetName, colName+"2", v.Level1)
// xlsxFile.SetCellStr(sheetName, colName+"3", v.Level2)
// xlsxFile.SetCellStr(sheetName, colName+"4", v.Level3)
// xlsxFile.SetCellStr(sheetName, colName+"5", v.Level4)
// }
// //从第六行开始写入用户填写的评估数据
// for k, v := range tableRowSort {
// rowNum := strconv.Itoa(k + 6)
// row := tableRows[v]
// for k2, v2 := range headerList {
// if k2 == 0 {
// xlsxFile.SetCellStr(sheetName, "A"+rowNum, row["BeginDay"])
// continue
// }
// if k2 == 1 {
// xlsxFile.SetCellStr(sheetName, "B"+rowNum, row["TargetUserName"])
// continue
// }
// colName, _ := excelize.ColumnNumberToName(k2 + 1)
// key := v2.Level1 + "+" + v2.Level3
// if mVal, ok := row[key]; ok {
// xlsxFile.SetCellStr(sheetName, colName+rowNum, mVal)
// }
// }
// }
// //TODO 调整样式
// xlsxFile.MergeCell(sheetName, "A2", "A4")
// xlsxFile.MergeCell(sheetName, "B2", "B4")
// xlsxFile.MergeCell(sheetName, "B5", "B5")
// //设置行高
// for i := range tableRowSort {
// xlsxFile.SetRowHeight(sheetName, i+5, 50)
// }
// //设置列宽
// for i := range headerList {
// colName, _ := excelize.ColumnNumberToName(i + 1)
// if i == 0 {
// xlsxFile.SetColWidth(sheetName, colName, colName, 30)
// }
// }
// return xlsxFile, nil
// }
//员工绩效-项目管理-矩阵分析
func (srv StaffAssessServeice) AnalysisData(param *query.ListAssessContentCycleDay) (*adapter.AssessAnalysisResp, error) {
... ... @@ -708,7 +458,7 @@ func (srv StaffAssessServeice) QueryPerformanceIndicator(param *query.ListAssess
// 员工绩效-项目管理-成员列表导出
func (srv StaffAssessServeice) ExportUserAssess(param *query.ExportAssessContentCycleDay) (*excelize.File, error) {
func (srv *StaffAssessServeice) ExportUserAssess(param *query.ExportAssessContentCycleDay) (*excelize.File, error) {
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
... ...
... ... @@ -27,7 +27,7 @@ func (srv StaffAssessServeice) SearchAssessTaskMeV2(param *query.SearchAssessMeQ
_ = transactionContext.RollbackTransaction()
}()
staffAssessTaskRepo := dao.NewStaffAssessDao(map[string]interface{}{
staffAssessDao := dao.NewStaffAssessDao(map[string]interface{}{
"transactionContext": transactionContext,
})
var limit int = 360
... ... @@ -36,20 +36,39 @@ func (srv StaffAssessServeice) SearchAssessTaskMeV2(param *query.SearchAssessMeQ
limit = param.PageSize
}
offset = (param.PageNumber - 1) * param.PageSize
assessCycleList, err := staffAssessTaskRepo.SearchAssessCycleMe(param.UserId, param.CompanyId, limit, offset)
// assessCycleList, err := staffAssessTaskRepo.SearchAssessCycleMe(param.UserId, param.CompanyId, limit, offset)
// if err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "查询评估周期"+err.Error())
// }
// cnt, err := staffAssessTaskRepo.CountAssessTaskMe(param.UserId, param.CompanyId)
// if err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "查询评估周期"+err.Error())
// }
assessCycleList, cnt, err := staffAssessDao.SearchExecutorAssessBeforeNow(param.UserId, param.CompanyId, limit, offset)
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "查询评估周期"+err.Error())
}
cnt, err := staffAssessTaskRepo.CountAssessTaskMe(param.UserId, param.CompanyId)
assessCycleList2, err := staffAssessDao.SearchExecutorAssessAfterNow(param.UserId, param.CompanyId)
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "查询评估周期"+err.Error())
}
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
listData := make([]adapter.AssessCycleDayResp, 0, len(assessCycleList))
var temp adapter.AssessCycleDayResp
for _, v := range assessCycleList2 {
temp = adapter.AssessCycleDayResp{
CycleId: v.CycleId,
CycleName: v.CycleName,
BeginDay: v.BeginDay,
BeginTime: v.BeginTime,
EndTime: v.EndTime,
}
listData = append(listData, temp)
}
for _, v := range assessCycleList {
temp = adapter.AssessCycleDayResp{
CycleId: v.CycleId,
... ... @@ -686,7 +705,7 @@ func (srv StaffAssessServeice) GetAssessSelfInfoV2(param *query.GetExecutorSelfA
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取员工的评估"+err.Error())
}
if len(assessList) == 0 {
return nil, application.ThrowError(application.BUSINESS_ERROR, "不存在员工的自评内容")
return &adapter.AssessInfoResp{AssessId: -1}, nil
}
assessData := assessList[0]
... ... @@ -832,3 +851,77 @@ func (srv StaffAssessServeice) ListTargetUserSuperAssess(param *query.ListTarget
}
return tool_funs.SimpleWrapGridMap(int64(cnt), resultList), nil
}
// 选择员工评估可邀请的用户
func (srv StaffAssessServeice) SelectAssessInviteUserV2(param *query.SelectAssessInviteUser) (map[string]interface{}, error) {
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
if err := transactionContext.StartTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
defer func() {
_ = transactionContext.RollbackTransaction()
}()
//获取被评估的目标用户
userRepo := factory.CreateUserRepository(map[string]interface{}{
"transactionContext": transactionContext,
})
//获取公司信息
companyRepo := factory.CreateCompanyRepository(map[string]interface{}{
"transactionContext": transactionContext,
})
companyInfo, _ := companyRepo.FindOne(map[string]interface{}{
"id": param.CompanyId,
})
targetUser, err := userRepo.FindOne(map[string]interface{}{
"id": param.TargetUserId,
})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取员工信息"+err.Error())
}
//查询员工数据
condition := map[string]interface{}{
"companyId": param.CompanyId,
"name": param.InviteUserName,
"limit": 20,
"status": 1,
}
if param.PageSize > 0 {
condition["limit"] = param.PageSize
}
offset := (param.PageNumber - 1) * param.PageSize
if offset > 0 {
condition["offset"] = offset
}
cnt, userList, err := userRepo.Find(condition)
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取员工列表信息"+err.Error())
}
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
listData := []adapter.SelectInviteUser{}
companyName := ""
if companyInfo != nil {
companyName = companyInfo.Name
}
for _, v := range userList {
_ = v
_ = companyName
item := adapter.SelectInviteUser{
UserId: int(v.Id),
UserName: v.Name,
CompanyName: companyName,
IsSupper: false,
Types: 2, //默认是不同上级
}
if targetUser.ParentId == v.ParentId {
item.Types = 1
}
listData = append(listData, item)
}
return tool_funs.SimpleWrapGridMap(int64(cnt), listData), nil
}
... ...
package adapter
//综合评估的周期列表
type CycleListAdapter struct {
CycleId string `json:"cycleId"` //周期id
CycleName string `json:"cycleName"` //
}
... ...
package adapter
import "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain"
// 评估信息详情
type EvaluationInfoAdapter struct {
SummaryEvaluationId int `json:"summaryEvaluationId,string"` //
CycleId int `json:"cycleId,string"` //周期id
CycleName string `json:"cycleName"` //周期名称
EvaluationProjectId int `json:"evaluationProjectId"` //项目id
EvaluationProjectName string `json:"evaluationProjectName"` //项目名称
LinkNodeId int `json:"linkNodeId,string"` //评估环节id
BeginTime string `json:"beginTime"` //开始时间 2006-01-02 15:04:05
EndTime string `json:"endTime"` //结束时间 2006-01-02 15:04:05
TargetUserId int `json:"targetUserId"` //被评估的目标用户,被执行的
TargetUserName string `json:"targetUserName"` //
CompanyLogo string `json:"companyLogo"` //公司logo
CompanyName string `json:"companyName"` //公司名称
SupperUser string `json:"superUser"` //目标用户的上级
DutyTime string `json:"dutyTime"` //入职时间
Status string `json:"status"` //完成状态
EvaluationItems []EvaluationItemAdapter `json:"evaluationItems"`
}
// 评估填写项
type EvaluationItemAdapter struct {
EvaluationItemId int `json:"evaluationItemId,string"` //评估条目的id
SortBy int `json:"sortBy"` //排序
Category string `json:"category"` //类别
Name string `json:"name"` //名称
PromptTitle string `json:"promptTitle"` //提示项标题
PromptText string `json:"promptText"` //提示项正文
EntryItems []*domain.EntryItem `json:"entryItems"` //填写的反馈
RuleType int `json:"ruleType"` //评估方式(0评级、1评分)
Rule domain.EvaluationRule `json:"rule"` //评估的选项规则
Weight float64 `json:"weight"` //"权重"
Required int `json:"required"` // 必填项
Value string `json:"value"` //评估填写的评分
Score string `json:"score"` //计算的评定得分
Rating domain.RatingLevel `json:"rating"` //评级的选项
Remark string `json:"remark"` //填写的内容反馈
EvaluatorId int `json:"evaluatorId"` //评估人id
EvaluatorName string `json:"evaluatorName"` //评估人名称
ForbidEdit bool `json:"forbidEdit"` //页面操作控制是否禁用编辑
}
// 评级数量
type LevalCodeCount struct {
Code string `json:"code"` //评级代码
Number int `json:"number"` //数量
ItemList []string `json:"itemList"` //对应的评估项名称
}
// 评估任务的基本信息
type EvaluationBaseAdapter struct {
SummaryEvaluationId int `json:"summaryEvaluationId,string"` //
CycleId int `json:"cycleId,string"` //周期id
CycleName string `json:"cycleName"` //周期名称
EvaluationProjectId int `json:"evaluationProjectId,string"` //项目id
EvaluationProjectName string `json:"evaluationProjectName"` //项目名称
LinkNodeId int `json:"linkNodeId,string"` //评估环节id
BeginTime string `json:"beginTime"` //开始时间 2006-01-02 15:04:05
EndTime string `json:"endTime"` //结束时间 2006-01-02 15:04:05
TargetUserId int `json:"targetUserId,string"` //被评估的目标用户,被执行的
TargetUserName string `json:"targetUserName"` //
CompanyLogo string `json:"companyLogo,"` //公司logo
CompanyName string `json:"companyName"` //公司名称
SupperUser string `json:"superUser"` //目标用户的上级
Types int `json:"types"` //评估类型
DutyTime string `json:"dutyTime"` //入职时间
Status string `json:"status"` //完成状态
CheckResult string `json:"checkResult"` //确认绩效结果
TotalScore string `json:"totalScore"` //评估总分
}
// 自评估内容详情
type EvaluationInfoSelfAdapter struct {
EvaluationBaseAdapter
EvaluationItems []EvaluationItemAdapter `json:"evaluationItems"`
}
// 自评小结展示,每个评估项
type EvaluationItemCountCodeAdapter struct {
EvaluationItemAdapter
LevelCount []LevalCodeCount `json:"levelCount"` //周期内每次评估的等级数量统计
}
// 自评小结展示
type EvaluationInfoCountCodeAdapter struct {
EvaluationBaseAdapter
EvaluationItems []EvaluationItemCountCodeAdapter `json:"evaluationItems"`
}
// 上级评估详情
type EvaluationInfoSuperAdapter struct {
EvaluationBaseAdapter
LevelCount []*LevalCodeCount `json:"levelCount"` //周期内每次评估的等级数量统计
EvaluationItems []EvaluationItemAdapter `json:"evaluationItems"`
}
... ...
package adapter
type EvaluationSuperListAdapter struct {
SummaryEvaluationId int `json:"summaryEvaluationId,string"` //评估任务id
TargetUserName string `json:"targetUserName"` //目标用户,被评估的员工
TargetUserId int `json:"targetUserId,string"` //目标用户,被评估的员工
EvaluationStatus string `json:"evaluationStatus"` //上级评估完成状态
EndTime string `json:"endTime"` //截止时间
TotalScoreSelf string `json:"totalScoreSelf"` //综合自评总分
Department string `json:"department"` //部门
Position string `json:"position"` //职位
EntryTime string `json:"entryTime"` //入职时间
}
type EvaluationSuperItemAdapter struct {
SummaryEvaluationId int `json:"summaryEvaluationId,string"` //评估任务id
TargetUserName string `json:"targetUserName"` //目标用户,被评估的员工
TargetUserId int `json:"targetUserId,string"` //目标用户,被评估的员工
CycleId int64 `json:"cycleId,string"` //周期id
TotalScore string `json:"totalScore"` //得分
Department string `json:"department"` //部门
Position string `json:"position"` //职位
}
... ...
package adapter
type MenuListAdapter struct {
CycleId int `json:"cycleId,string"`
NodeName string `json:"nodeName"`
StatusName string `json:"statusName"`
TargetUserId int `json:"targetUserId,string"`
Types string `json:"types"`
Child []MenuListAdapter `json:"child"`
}
... ...
package adapter
type TableHeader struct {
Key string `json:"key"`
Name string `json:"name"`
}
type SummaryEvaluationAdapter struct {
TableHeader []TableHeader `json:"tableHeader"`
List []map[string]interface{} `json:"list"`
Total int `json:"total"`
}
type SummaryEvaluationHRBPAdapter struct {
Id int `json:"id,string"` // 周期评估ID
TargetUserId int `json:"targetUserId,string"` // 目标用户ID
TargetUserName string `json:"targetUserName"` // 目标用户名称
Department string `json:"departmentVal"` // 部门(拼接文本)
Position string `json:"positionVal"` // 职位(拼接文本)
DutyTime string `json:"dutyTime"` // 入职时间(2006-01-02 15:04)
Status string `json:"statusVal"` // 完成状态(拼接文本)
EndTime string `json:"endTime"` // 截止时间(2006-01-02 15:04)
OverdueCount int `json:"overdueCount"` // 自评逾期次数
}
... ...
package command
// 员工确认 周期评估 分数
type ConfirmScore struct {
SummaryEvaluationId int `json:"summaryEvaluationId,string"`
UserId int `json:"-"`
}
... ...
package command
type EditEvaluationValue struct {
SummaryEvaluationId int `json:"summaryEvaluationId,string"`
ExecutorId int `json:"-"` // 执行人id
CompanyId int `json:"-"` // 公司id
EvaluationItems []UpdatedItemValue `json:"evaluationItems"`
IsTemporary bool `json:"isTemporary"` //是否是临时提交
}
type UpdatedItemValue struct {
Value string `json:"value"`
Remark string `json:"remark"`
EvaluationItemId int `json:"evaluationItemId,string"`
}
... ...
package command
// type QueryEvaluationInfo struct {
// CycleId int `json:"cycleId,string"` //周期id
// ExecutorId int `json:"executorId,string"` //执行人id
// CompanyId int `json:"-"` //公司id
// }
type QueryEvaluation struct {
CycleId int `json:"cycleId,string"` //周期id
TargetUserId int `json:"targetUserId,string"` //员工id
CompanyId int `json:"-"` //公司id
}
// QueryEvaluation360My [我] 对 [目标用户]进行360评估
type QueryEvaluation360My struct {
SummaryEvaluationId int `json:"summaryEvaluationId,string"`
CompanyId int `json:"-"` // 公司ID
UserId int `json:"-"` // 用户ID
}
// QueryEvaluation360 [他人] 对 [目标用户]进行360评估
type QueryEvaluation360 struct {
CycleId int `json:"cycleId,string"` // 周期ID
TargetUserId int `json:"targetUserId,string"` // 目标人ID
CompanyId int `json:"-"` // 公司ID
}
// QueryEvaluationHRBPMy [HRBP] 对 [目标用户] 进行评估
type QueryEvaluationHRBPMy struct {
SummaryEvaluationId int `json:"summaryEvaluationId,string"`
CompanyId int `json:"-"` // 公司ID
}
// QueryEvaluationHRBP [HRBP] 对 [目标用户]进行评估,状态已完成
type QueryEvaluationHRBP struct {
CycleId int `json:"cycleId,string"` // 周期ID
TargetUserId int `json:"targetUserId,string"` // 目标人ID
CompanyId int `json:"-"` // 公司ID
}
// QueryEvaluationSuper 获取上级评估详情
type QueryEvaluationSuper struct {
SummaryEvaluationId int `json:"summaryEvaluationId,string"`
CompanyId int `json:"-"`
}
... ...
package command
// 获取周期列表
type QueryCycleList struct {
UserId int `json:"userId,string"`
CompanyId int `json:"-"`
Types int `json:"types"`
PageSize int `json:"pageSize"`
PageNumber int `json:"pageNumber"`
}
... ...
package command
// QueryEvaluation360List 360综评列表
type QueryEvaluation360List struct {
CycleId int `cname:"周期ID" json:"cycleId,string" valid:"Required"`
PageNumber int `cname:"分页页码" json:"pageNumber" valid:"Required"`
PageSize int `cname:"分页数量" json:"pageSize" valid:"Required"`
SearchName string `cname:"用户名称" json:"searchName"`
CompanyId int `cname:"公司ID" json:"-"`
UserId int `cname:"用户ID" json:"-"`
}
// QueryEvaluationHRList 人资综评列表
type QueryEvaluationHRList struct {
CycleId int `cname:"周期ID" json:"cycleId,string" valid:"Required"`
PageNumber int `cname:"分页页码" json:"pageNumber" valid:"Required"`
PageSize int `cname:"分页数量" json:"pageSize" valid:"Required"`
SearchName string `cname:"用户名称" json:"searchName"`
CompanyId int `cname:"公司ID" json:"-"`
UserId int `cname:"用户ID" json:"-"`
}
... ...
package command
// 查询执行人的评估列表
type QueryExecutorEvaluationList struct {
PageNumber int `json:"pageNumber"`
PageSize int `json:"pageSize"`
CycleId int `json:"cycleId,string"`
CompanyId int `json:"-"`
ExecutorId int `json:"-"`
TargetUserName string `json:"targetUserName"`
}
// 查询上级评估列表
type QueryEvaluationList struct {
PageNumber int `json:"pageNumber"`
PageSize int `json:"pageSize"`
CycleId int `json:"cycleId,string"`
CompanyId int `json:"-"` //当前公司
UserId int `json:"-"` //当前操作的员工id
TargetUserName string `json:"targetUserName"` //按照目标员工的名称搜索
SummaryEvaluationId []string `json:"summaryEvaluationId"` //按照id 获取数据
}
... ...
package command
// QueryMenuCommand
type QueryMenu struct {
CycleId int `json:"cycleId,string"` //周期id
UserId int `json:"userId,string"` //操作人id
CompanyId int `json:"companyId,string"` //操作人公司id
}
... ...
package service
import (
"fmt"
"strconv"
"github.com/linmadan/egglib-go/core/application"
"github.com/xuri/excelize/v2"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/factory"
roleService "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/role"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/summary_evaluation/command"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain"
)
// 导出数据
// 综合管理-周期评估
func (srv *SummaryEvaluationService) ExportAllEvaluationSuper(param *command.QueryEvaluationList) (*excelize.File, error) {
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
if err := transactionContext.StartTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
defer func() {
_ = transactionContext.RollbackTransaction()
}()
//判断是否是hrbp
flagHrbp, err := roleService.GetHRBP(transactionContext, param.CompanyId, param.UserId)
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
if flagHrbp != 1 {
return nil, application.ThrowError(application.BUSINESS_ERROR, "暂无数据")
}
//判断是否是上级
userRepo := factory.CreateUserRepository(map[string]interface{}{
"transactionContext": transactionContext,
})
_, parentUser, _ := userRepo.Find(map[string]interface{}{
"parentId": param.UserId,
"limit": 1,
})
if len(parentUser) == 0 {
return nil, application.ThrowError(application.BUSINESS_ERROR, "暂无数据")
}
evaluationRepo := factory.CreateSummaryEvaluationRepository(map[string]interface{}{
"transactionContext": transactionContext,
})
positionRepo := factory.CreatePositionRepository(map[string]interface{}{
"transactionContext": transactionContext,
})
limit := param.PageSize
offset := (param.PageNumber - 1) * param.PageSize
//获取评估列表信息
condition1 := map[string]interface{}{
"cycleId": param.CycleId,
"types": int(domain.EvaluationSuper),
"limit": limit,
}
if offset > 0 {
condition1["offset"] = offset
}
if len(param.TargetUserName) > 0 {
condition1["targetUserName"] = "%" + param.TargetUserName + "%"
}
if len(param.SummaryEvaluationId) > 0 {
summaryEvaluationIds := []int{}
for _, v := range param.SummaryEvaluationId {
id, _ := strconv.Atoi(v)
summaryEvaluationIds = append(summaryEvaluationIds, id)
}
if len(summaryEvaluationIds) > 0 {
condition1["id"] = summaryEvaluationIds
}
}
//获取评估列表信息
_, evaluationList, err := evaluationRepo.Find(condition1)
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
targetUserIds := []int{}
//获取员工信息
userMap := map[int64]*domain.User{}
for _, v := range evaluationList {
if _, ok := userMap[int64(v.TargetUser.UserId)]; ok {
continue
}
userMap[int64(v.TargetUser.UserId)] = nil
targetUserIds = append(targetUserIds, v.TargetUser.UserId)
}
if len(targetUserIds) > 0 {
_, userList, err := userRepo.Find(map[string]interface{}{
"ids": targetUserIds,
})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
userMap = map[int64]*domain.User{}
for _, v := range userList {
userMap[v.Id] = v
}
}
var positionIds []int
//获取职位列表
positionMap := map[int64]*domain.Position{}
for _, v := range userMap {
for _, v2 := range v.DepartmentId {
if _, ok := positionMap[int64(v2)]; ok {
continue
}
positionMap[int64(v2)] = nil
positionIds = append(positionIds, v2)
}
}
if len(positionIds) > 0 {
_, positionList, err := positionRepo.Find(map[string]interface{}{"ids": positionIds})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取部门信息"+err.Error())
}
positionMap = map[int64]*domain.Position{}
for _, v := range positionList {
positionMap[v.Id] = v
}
}
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
ratingHeader := []string{} //动态列,评级内容
ratingMap := map[string]struct{}{} //过滤重复code
evaluationRatingMap := map[int]map[string]int{}
for _, v := range evaluationList {
evaluationRatingMap[v.Id] = map[string]int{}
for _, v2 := range v.TotalRating {
if _, ok := ratingMap[v2.Code]; !ok {
ratingMap[v2.Code] = struct{}{}
ratingHeader = append(ratingHeader, v2.Code)
}
evaluationRatingMap[v.Id][v2.Code] = v2.Number
}
}
xlsxFile := excelize.NewFile()
//设置默认的第一个sheet
sheetIndex := xlsxFile.GetActiveSheetIndex()
firstSheetName := xlsxFile.GetSheetName(sheetIndex)
tableHead := []string{"姓名", "部门", "职位", "最终绩效得分"}
tableHead = append(tableHead, ratingHeader...)
xlsxFile.SetSheetRow(firstSheetName, "A1", &tableHead)
for i, v := range evaluationList {
departmentName := ""
for _, dep := range v.TargetDepartment {
departmentName += dep.DepartmentName + " "
}
//填充员工信息
positinName := ""
if targetUser, ok := userMap[int64(v.TargetUser.UserId)]; ok {
//填充职位信息
for _, positionId := range targetUser.PositionId {
if position, ok := positionMap[int64(positionId)]; ok {
positinName += position.Name + " "
}
}
}
dataRaw := []string{
v.TargetUser.UserName,
departmentName,
positinName,
v.TotalScore,
}
for _, v2 := range ratingHeader {
if num, ok := evaluationRatingMap[v.Id][v2]; ok {
dataRaw = append(dataRaw, fmt.Sprintf("%d", num))
} else {
dataRaw = append(dataRaw, "0")
}
}
xlsxFile.SetSheetRow(firstSheetName, fmt.Sprintf("A%d", i+2), &dataRaw)
}
return xlsxFile, nil
}
... ...
package service
import (
"fmt"
"strconv"
"time"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/factory"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/notify"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/infrastructure/dao"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/log"
)
// sendSummaryEvaluafionTask 根据评估项目设置,确认是否下发评估任务
// project 需要处理的项目
// userList 全体的员工数据 map[id]=>domain.User
// departmetList 全部的部门数据 map[id]=>domain.Department
func sendSummaryEvaluation(project *domain.EvaluationProject,
userMap map[int64]*domain.User, departmentMap map[int64]*domain.Department) ([]domain.SummaryEvaluation, error) {
//自评的时间范围
beginTimeSelf := project.EndTime
endTimeSelf := dayZeroTime(project.EndTime).Add(4*24*time.Hour - time.Second)
//人资、360评估的时间范围
beginTime360 := beginTimeSelf
endTime360 := endTimeSelf.Add(2 * 24 * time.Hour)
//上级评估的是时间范围
beginTimeSuper := endTime360
endTimeSuper := endTime360.Add(2 * 24 * time.Hour)
//
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return nil, err
}
if err := transactionContext.StartTransaction(); err != nil {
return nil, err
}
defer func() {
_ = transactionContext.RollbackTransaction()
}()
cycleRepo := factory.CreateEvaluationCycleRepository(map[string]interface{}{"transactionContext": transactionContext})
evaluationItemRepo := factory.CreateEvaluationItemUsedRepository(map[string]interface{}{"transactionContext": transactionContext})
cycleData, err := cycleRepo.FindOne(map[string]interface{}{"id": project.CycleId})
if err != nil {
return nil, err
}
//确定 被评估的人
targetUserId := []int64{}
for _, v := range project.Recipients {
id, err := strconv.ParseInt(v, 10, 64)
if err == nil {
targetUserId = append(targetUserId, id)
}
}
if len(targetUserId) == 0 {
return nil, nil
}
//被评估的员工
targetUserMap := map[int64]*domain.User{}
for _, v := range targetUserId {
u, ok := userMap[v]
if ok {
targetUserMap[v] = u
}
}
//确定360评估的执行人
_, itemList, err := evaluationItemRepo.Find(map[string]interface{}{"evaluationProjectId": project.Id, "nodeType": int(domain.LinkNodeSelfAssessment)})
if err != nil {
return nil, err
}
nodeId := 0
executor360Map := map[int64]*domain.User{}
for _, v := range itemList {
nodeId = v.NodeId
if v.EvaluatorId <= 0 {
continue
}
if u, ok := userMap[int64(v.EvaluatorId)]; ok {
executor360Map[u.Id] = u
}
}
//创建周期评估任务
var newEvaluationList []domain.SummaryEvaluation
evaluationTemp := domain.SummaryEvaluation{
Id: 0,
CompanyId: int(project.CompanyId),
EvaluationProjectId: int(project.Id),
EvaluationProjectName: project.Name,
CycleId: cycleData.Id,
CycleName: cycleData.Name,
NodeId: nodeId,
TargetUser: domain.StaffDesc{},
TargetDepartment: []domain.StaffDepartment{},
Executor: domain.StaffDesc{},
Types: 0,
Status: domain.EvaluationUncompleted,
CheckResult: domain.EvaluationCheckUncompleted,
BeginTime: time.Time{},
EndTime: time.Time{},
TotalScore: "",
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
DeletedAt: nil,
}
//确定自评
//确定 被评估人的 上级评估
for _, v := range targetUserMap {
//处理自评
evaluationTemp.TargetUser = domain.StaffDesc{
UserId: int(v.Id),
Account: v.Account,
UserName: v.Name,
}
evaluationTemp.Executor = domain.StaffDesc{
UserId: int(v.Id),
Account: v.Account,
UserName: v.Name,
}
evaluationTemp.BeginTime = beginTimeSelf
evaluationTemp.EndTime = endTimeSelf
evaluationTemp.TargetDepartment = []domain.StaffDepartment{}
evaluationTemp.Types = domain.EvaluationSelf
for _, departId := range v.DepartmentId {
depart, ok := departmentMap[int64(departId)]
if !ok {
continue
}
evaluationTemp.TargetDepartment = append(evaluationTemp.TargetDepartment, domain.StaffDepartment{
DepartmentId: int(depart.Id),
DepartmentName: depart.Name,
})
}
//确定自评
newEvaluationList = append(newEvaluationList, evaluationTemp)
//处理人资评估
evaluationTemp.BeginTime = beginTime360
evaluationTemp.EndTime = endTime360
evaluationTemp.Executor = domain.StaffDesc{}
evaluationTemp.Types = domain.EvaluationHrbp
//确定人资评估
newEvaluationList = append(newEvaluationList, evaluationTemp)
//处理360 评估
for _, v2 := range executor360Map {
evaluationTemp.BeginTime = beginTime360
evaluationTemp.EndTime = endTime360
evaluationTemp.Executor = domain.StaffDesc{
UserId: int(v2.Id),
Account: v2.Account,
UserName: v2.Name,
}
evaluationTemp.Types = domain.Evaluation360
//确定人资评估
newEvaluationList = append(newEvaluationList, evaluationTemp)
}
//处理上级评估
superUser, ok := userMap[v.ParentId]
if ok {
evaluationTemp.Types = domain.EvaluationSuper
evaluationTemp.Executor = domain.StaffDesc{
UserId: int(superUser.Id),
Account: superUser.Account,
UserName: superUser.Name,
}
evaluationTemp.BeginTime = beginTimeSuper
evaluationTemp.EndTime = endTimeSuper
//确定上级评估
newEvaluationList = append(newEvaluationList, evaluationTemp)
}
}
summaryEvaluationRepo := factory.CreateSummaryEvaluationRepository(map[string]interface{}{"transactionContext": transactionContext})
for i := range newEvaluationList {
err = summaryEvaluationRepo.Save(&newEvaluationList[i])
if err != nil {
return nil, err
}
}
//回填 项目的状态
projectDao := dao.NewEvaluationProjectDao(map[string]interface{}{"transactionContext": transactionContext})
err = projectDao.UpdateSummaryState(project.Id, domain.ProjectSummaryStateYes)
if err != nil {
return nil, err
}
if err := transactionContext.CommitTransaction(); err != nil {
return nil, err
}
return newEvaluationList, nil
}
func dayZeroTime(t time.Time) time.Time {
y, m, d := t.UTC().Date()
t2 := time.Date(y, m, d, 0, 0, 0, 0, time.UTC)
return t2
}
// 下发周期评估
func TaskSendSummaryEvaluation() error {
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return err
}
if err := transactionContext.StartTransaction(); err != nil {
return err
}
defer func() {
_ = transactionContext.RollbackTransaction()
}()
projectRepo := factory.CreateEvaluationProjectRepository(map[string]interface{}{
"transactionContext": transactionContext,
})
userRepo := factory.CreateUserRepository(map[string]interface{}{"transactionContext": transactionContext})
departmentRepo := factory.CreateDepartmentRepository(map[string]interface{}{"transactionContext": transactionContext})
_, projectList, err := projectRepo.Find(map[string]interface{}{
"endTime": time.Now(),
"summaryState": domain.ProjectSummaryStateNo,
"state": domain.ProjectStateEnable,
}, "template")
if err != nil {
return fmt.Errorf("获取可用的项目数据,%s", err)
}
companyIdMap := map[int64]struct{}{}
for _, v := range projectList {
companyIdMap[v.CompanyId] = struct{}{}
}
var createdEvalationList []domain.SummaryEvaluation
//获取可执行的项目
for companyId := range companyIdMap {
//获取员工数据,部门数据
_, userList, err := userRepo.Find(map[string]interface{}{"companyId": companyId})
if err != nil {
log.Logger.Error("TaskSendSummaryEvaluation 获取员工数据:" + err.Error())
continue
}
_, departmentList, err := departmentRepo.Find(map[string]interface{}{"companyId": companyId})
if err != nil {
log.Logger.Error("TaskSendSummaryEvaluation 获取部门数据:" + err.Error())
continue
}
//转map
userMap := map[int64]*domain.User{}
for _, v := range userList {
userMap[v.Id] = v
}
departmentMap := map[int64]*domain.Department{}
for _, v := range departmentList {
departmentMap[v.Id] = v
}
for _, v := range projectList {
if v.CompanyId != companyId {
continue
}
evalationList, err := sendSummaryEvaluation(v, userMap, departmentMap)
if err != nil {
log.Logger.Error("TaskSendSummaryEvaluation 下发评估任务:" + err.Error())
continue
}
createdEvalationList = append(createdEvalationList, evalationList...)
}
}
if err := transactionContext.CommitTransaction(); err != nil {
return err
}
//添加待发送的短信通知
err = sendSmsEvalation(createdEvalationList)
return err
}
// 添加待发送的短信通知
func sendSmsEvalation(param []domain.SummaryEvaluation) error {
for i := range param {
if param[i].Types == domain.EvaluationSelf {
notify.AddNotifySummaryEvaluation(&param[i])
}
}
return nil
}
... ...