Merge remote-tracking branch 'origin/main'
This commit is contained in:
		
						commit
						c6b0c638c5
					
				| 
						 | 
				
			
			@ -58,7 +58,8 @@
 | 
			
		|||
    "@tarojs/taro": "3.6.26",
 | 
			
		||||
    "dayjs": "^1.11.13",
 | 
			
		||||
    "pinia": "^2.2.2",
 | 
			
		||||
    "vue": "^3.0.0"
 | 
			
		||||
    "vue": "^3.0.0",
 | 
			
		||||
    "vuex": "^4.0.2"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@babel/core": "^7.8.0",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
import {MINI_PROGRAM_USER_CONFIG} from "@/config";
 | 
			
		||||
import { MINI_PROGRAM_USER_CONFIG } from "@/config";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const tabBarItems = Object.values(MINI_PROGRAM_USER_CONFIG).map(item => item.tabBarList).flat()
 | 
			
		||||
| 
						 | 
				
			
			@ -17,14 +17,24 @@ export default defineAppConfig({
 | 
			
		|||
        'myProject/projectDetails/projectDetails',
 | 
			
		||||
        'securityUserForm/securityUserForm',
 | 
			
		||||
      ]
 | 
			
		||||
    }, {
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      root: "subPages/police",
 | 
			
		||||
      pages: [
 | 
			
		||||
        'dailyInspection/dailyInspection',
 | 
			
		||||
        'myEnterprisesUnit/myEnterprisesUnit',
 | 
			
		||||
        'myEnterprisesUnit/projectDetails/projectDetails'
 | 
			
		||||
      ]
 | 
			
		||||
    }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      root: "subPages/select",
 | 
			
		||||
      pages: [
 | 
			
		||||
        'dailyLife/dailyLife',
 | 
			
		||||
        'signature/signature'
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
  ],
 | 
			
		||||
 | 
			
		||||
  window: {
 | 
			
		||||
    backgroundTextStyle: 'light',
 | 
			
		||||
    navigationBarBackgroundColor: '#4e87ff',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,30 +3,28 @@
 | 
			
		|||
    <view class="swiperDemo">
 | 
			
		||||
      <nut-swiper ref="swiperRef" pagination-visible pagination-color="#e53e31" :auto-play="3000" :init-page="0">
 | 
			
		||||
        <nut-swiper-item v-for="(item, index) in list" :key="index" style="height: 180px">
 | 
			
		||||
          <image :src="item" alt="" style="height: 100%; width: 100%" draggable="false"/>
 | 
			
		||||
          <view>1123</view>
 | 
			
		||||
          <image :src="item" alt="" style="height: 100%; width: 100%" draggable="false" />
 | 
			
		||||
        </nut-swiper-item>
 | 
			
		||||
      </nut-swiper>
 | 
			
		||||
    </view>
 | 
			
		||||
    <view class="nameTitle">
 | 
			
		||||
      <view class="itemSchool" >
 | 
			
		||||
      <view class="itemSchool">
 | 
			
		||||
        <text>单位数量</text>
 | 
			
		||||
        <text
 | 
			
		||||
            style=" white-space: nowrap;overflow: hidden;text-overflow: ellipsis;width: 80px;text-align: center">{{numberStatistics.enterprisesUnitCount}}</text>
 | 
			
		||||
        <text style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: 80px; text-align: center">{{ numberStatistics.enterprisesUnitCount }}</text>
 | 
			
		||||
      </view>
 | 
			
		||||
      <view class="itemSchool">
 | 
			
		||||
        <text>服务项目</text>
 | 
			
		||||
        <text>
 | 
			
		||||
          {{numberStatistics.serviceProjectCount}}
 | 
			
		||||
          {{ numberStatistics.serviceProjectCount }}
 | 
			
		||||
        </text>
 | 
			
		||||
      </view>
 | 
			
		||||
      <view class="itemSchool">
 | 
			
		||||
        <text>有保安证人员</text>
 | 
			
		||||
        <text>{{numberStatistics.securityUserCount}}</text>
 | 
			
		||||
        <text>{{ numberStatistics.securityUserCount }}</text>
 | 
			
		||||
      </view>
 | 
			
		||||
      <view class="itemSchool">
 | 
			
		||||
        <text>无保安证人员</text>
 | 
			
		||||
        <text>{{numberStatistics.noCardSecurityUserCount}}</text>
 | 
			
		||||
        <text>{{ numberStatistics.noCardSecurityUserCount }}</text>
 | 
			
		||||
      </view>
 | 
			
		||||
    </view>
 | 
			
		||||
    <view class="swiperDemoItem">
 | 
			
		||||
| 
						 | 
				
			
			@ -35,23 +33,21 @@
 | 
			
		|||
    </view>
 | 
			
		||||
    <!--九宫格-->
 | 
			
		||||
    <view class="Module">
 | 
			
		||||
      <view class="subModule" >
 | 
			
		||||
        <view class="subModuleItem" v-for="item in subModuleList" :key="item.id"
 | 
			
		||||
              @click="subNavigation(item.url)">
 | 
			
		||||
      <view class="subModule">
 | 
			
		||||
        <view class="subModuleItem" v-for="item in subModuleList" :key="item.id" @click="subNavigation(item.url)">
 | 
			
		||||
          <view class="subModuleIndex">
 | 
			
		||||
            <image :src="item.icon"></image>
 | 
			
		||||
          </view>
 | 
			
		||||
          <view style=" font-size: 12px;color: #414141;margin-top: 5px">{{item.name}}</view>
 | 
			
		||||
          <view style="font-size: 12px; color: #414141; margin-top: 5px">{{ item.name }}</view>
 | 
			
		||||
        </view>
 | 
			
		||||
      </view>
 | 
			
		||||
    </view>
 | 
			
		||||
    <view style="background-color: #e9eef4;height: 15rpx"></view>
 | 
			
		||||
 | 
			
		||||
    <view style="background-color: #e9eef4; height: 15rpx"></view>
 | 
			
		||||
  </view>
 | 
			
		||||
</template>
 | 
			
		||||
<script setup lang="ts">
 | 
			
		||||
import {onMounted, ref} from 'vue'
 | 
			
		||||
import Taro from "@tarojs/taro";
 | 
			
		||||
import { onMounted, ref } from 'vue'
 | 
			
		||||
import Taro from '@tarojs/taro'
 | 
			
		||||
import icon from '@/assets/images/project.png'
 | 
			
		||||
import icon01 from '@/assets/images/回单.jpg'
 | 
			
		||||
import icon02 from '@/assets/images/工单.jpg'
 | 
			
		||||
| 
						 | 
				
			
			@ -59,8 +55,8 @@ import icon03 from '@/assets/images/排名.jpg'
 | 
			
		|||
import icon04 from '@/assets/images/法制宣传.jpg'
 | 
			
		||||
import icon06 from '@/assets/images/警保风采.jpg'
 | 
			
		||||
import './index.scss'
 | 
			
		||||
import api from "@/request";
 | 
			
		||||
import {DataStatisticsRes} from "@/types/pages/police";
 | 
			
		||||
import api from '@/request'
 | 
			
		||||
import { DataStatisticsRes } from '@/types/pages/police'
 | 
			
		||||
const list = ref([process.env.TARO_APP_MINIO_URL + '/police-security/2024/11/5/dunpai.jpg'])
 | 
			
		||||
const swiperRef = ref() //轮播图
 | 
			
		||||
const subModuleList = ref([
 | 
			
		||||
| 
						 | 
				
			
			@ -68,54 +64,53 @@ const subModuleList = ref([
 | 
			
		|||
    id: 0,
 | 
			
		||||
    icon: icon,
 | 
			
		||||
    name: '项目管理',
 | 
			
		||||
    url: '/subPages/police/myEnterprisesUnit/myEnterprisesUnit'
 | 
			
		||||
    url: '/subPages/police/myEnterprisesUnit/myEnterprisesUnit',
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    id: 1,
 | 
			
		||||
    icon: icon02,
 | 
			
		||||
    name: '整改工单',
 | 
			
		||||
    url: ''
 | 
			
		||||
    name: '监督考核',
 | 
			
		||||
    url: '/subPages/police/dailyInspection/dailyInspection',
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    id: 2,
 | 
			
		||||
    icon: icon03,
 | 
			
		||||
    name: '考核排名',
 | 
			
		||||
    url: ''
 | 
			
		||||
    url: '',
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    id: 3,
 | 
			
		||||
    icon: icon06,
 | 
			
		||||
    name: '警保风采',
 | 
			
		||||
    url: ''
 | 
			
		||||
    url: '',
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    id: 4,
 | 
			
		||||
    icon: icon04,
 | 
			
		||||
    name: '法制宣传',
 | 
			
		||||
    url: ''
 | 
			
		||||
    url: '',
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    id: 5,
 | 
			
		||||
    icon: icon01,
 | 
			
		||||
    name: '整改回单',
 | 
			
		||||
    url: ''
 | 
			
		||||
  }
 | 
			
		||||
    url: '',
 | 
			
		||||
  },
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
const  numberStatistics = ref<DataStatisticsRes>({
 | 
			
		||||
  enterprisesUnitCount:0,
 | 
			
		||||
  serviceProjectCount:0,
 | 
			
		||||
  securityUserCount:0,
 | 
			
		||||
  noCardSecurityUserCount:0
 | 
			
		||||
const numberStatistics = ref<DataStatisticsRes>({
 | 
			
		||||
  enterprisesUnitCount: 0,
 | 
			
		||||
  serviceProjectCount: 0,
 | 
			
		||||
  securityUserCount: 0,
 | 
			
		||||
  noCardSecurityUserCount: 0,
 | 
			
		||||
})
 | 
			
		||||
const dataStatistics = async ()=>{
 | 
			
		||||
    const resp = await api.get<DataStatisticsRes>('/policeIndex/dataStatistics')
 | 
			
		||||
    numberStatistics.value = resp.data as DataStatisticsRes
 | 
			
		||||
const dataStatistics = async () => {
 | 
			
		||||
  const resp = await api.get<DataStatisticsRes>('/policeIndex/dataStatistics')
 | 
			
		||||
  numberStatistics.value = resp.data as DataStatisticsRes
 | 
			
		||||
}
 | 
			
		||||
onMounted(async()=>{
 | 
			
		||||
onMounted(async () => {
 | 
			
		||||
  await dataStatistics()
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
const subNavigation = async (url: string) => Taro.navigateTo({url})
 | 
			
		||||
 | 
			
		||||
const subNavigation = async (url: string) => Taro.navigateTo({ url })
 | 
			
		||||
</script>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,41 @@
 | 
			
		|||
import { defineStore } from 'pinia'
 | 
			
		||||
 | 
			
		||||
export const useDailyStore = defineStore('daily', {
 | 
			
		||||
  state: () => ({
 | 
			
		||||
    userdailyinspection: [],
 | 
			
		||||
    base64_1: '',
 | 
			
		||||
    base64_2: '',
 | 
			
		||||
 | 
			
		||||
  }),
 | 
			
		||||
  actions: {
 | 
			
		||||
    dailyinspectionList(data) {
 | 
			
		||||
      this.userdailyinspection = [...data]
 | 
			
		||||
    },
 | 
			
		||||
    change_base64_1(data) {
 | 
			
		||||
      // console.log("🚀 ~ change_base64_1 ~ data:", data)
 | 
			
		||||
      this.base64_1 = data
 | 
			
		||||
    },
 | 
			
		||||
    change_base64_2(data) {
 | 
			
		||||
      this.base64_2 = data
 | 
			
		||||
    },
 | 
			
		||||
    cleardailtcolour() {
 | 
			
		||||
      this.userdailyinspection = {
 | 
			
		||||
        ...this.userdailyinspection,
 | 
			
		||||
        markColor: this.userdailyinspection.markColor,
 | 
			
		||||
        markColor1: this.userdailyinspection.markColor,
 | 
			
		||||
        comment: ''
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  getters: {
 | 
			
		||||
    getdailyinspection(state) {
 | 
			
		||||
      return state.userdailyinspection
 | 
			
		||||
    },
 | 
			
		||||
    get_base64_1(state) {
 | 
			
		||||
      return state.base64_1
 | 
			
		||||
    },
 | 
			
		||||
    get_base64_2(state) {
 | 
			
		||||
      return state.base64_2
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
})
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,41 @@
 | 
			
		|||
page {
 | 
			
		||||
  position: relative;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.container {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.picker {
 | 
			
		||||
  padding: 30rpx 30rpx;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  justify-content: space-between;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.exit {
 | 
			
		||||
  height: 100rpx;
 | 
			
		||||
  line-height: 40px;
 | 
			
		||||
  border-bottom: solid 0.5px #ebebf7;
 | 
			
		||||
  box-sizing: border-box;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  justify-content: space-between;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
 | 
			
		||||
  .exitItem {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .iconoscope {
 | 
			
		||||
    z-index: 9999;
 | 
			
		||||
    width: 8px;
 | 
			
		||||
    height: 8px;
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    border: solid 2px #c2c2c2;
 | 
			
		||||
    margin-left: 10px;
 | 
			
		||||
    transform: rotate(45deg);
 | 
			
		||||
    border-bottom: white;
 | 
			
		||||
    border-left: white;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
export default definePageConfig({
 | 
			
		||||
  navigationBarTitleText: '监督考核',
 | 
			
		||||
})
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,324 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <view class="container">
 | 
			
		||||
    <!-- picker -->
 | 
			
		||||
    <picker mode="selector" :range="selector" rangeKey="label" @change="onChange">
 | 
			
		||||
      <view class="picker">
 | 
			
		||||
        考核单位:
 | 
			
		||||
        <view style="display: flex; align-items: center">
 | 
			
		||||
          <view v-if="selectorChecked.length === 0" style="color: #606266">请选择考核单位:</view>
 | 
			
		||||
          <view> {{ selectorChecked }}</view>
 | 
			
		||||
          <IconFont name="arrow-right"></IconFont>
 | 
			
		||||
        </view>
 | 
			
		||||
      </view>
 | 
			
		||||
    </picker>
 | 
			
		||||
 | 
			
		||||
    <!-- picker -->
 | 
			
		||||
    <!-- 如果 selectorType 为 undefined 或 null,?.length 会返回 undefined,然后通过 ?? 运算符将其替换为 0,确保条件判断不会出错。 -->
 | 
			
		||||
    <picker v-if="(selectorType?.length ?? 0) > 0" mode="selector" :range="selectorType" rangeKey="label" @change="onChangeType">
 | 
			
		||||
      <view class="picker">
 | 
			
		||||
        当前考核项目:
 | 
			
		||||
        <view style="display: flex; align-items: center">
 | 
			
		||||
          <view v-if="selectorCheckedType.length === 0" style="color: #606266">请选择考核项目</view>
 | 
			
		||||
          <view> {{ selectorCheckedType }}</view>
 | 
			
		||||
          <IconFont name="arrow-right"></IconFont>
 | 
			
		||||
        </view>
 | 
			
		||||
      </view>
 | 
			
		||||
    </picker>
 | 
			
		||||
    <!-- 选择题 -->
 | 
			
		||||
    <view class="exit" v-for="item in starRating" :key="item.snowFlakeId" @click="Onrating(item.name, item.snowFlakeId)">
 | 
			
		||||
      <view class="exitItem">
 | 
			
		||||
        <text style="margin-left: 30rpx; font-size: 16px">
 | 
			
		||||
          <text>{{ item.name }}({{ item.totalScore }}分) </text>
 | 
			
		||||
        </text>
 | 
			
		||||
      </view>
 | 
			
		||||
      <view style="margin-right: 30rpx; display: flex; align-items: center">
 | 
			
		||||
        <view v-if="item.currentScore > 0" style="color: #ff0000"> -{{ item.currentScore }}</view>
 | 
			
		||||
        <IconFont name="arrow-right"></IconFont>
 | 
			
		||||
      </view>
 | 
			
		||||
    </view>
 | 
			
		||||
 | 
			
		||||
    <view>
 | 
			
		||||
      <nut-form labelWidth="320rpx" labelAlign="left">
 | 
			
		||||
        <nut-form-item label="备注">
 | 
			
		||||
          <nut-input v-model="_form.remark" placeholder="请输入备注" type="text" />
 | 
			
		||||
        </nut-form-item>
 | 
			
		||||
 | 
			
		||||
        <nut-form-item label="考核人员签字:">
 | 
			
		||||
          <navigator :url="`/subPages/select/signature/signature?index=${1}`" hover-class="navigator-hover">
 | 
			
		||||
            <image v-if="_form.assessmentUserSignature" :src="_form.assessmentUserSignature" mode="heightFix" style="height: 80rpx"></image>
 | 
			
		||||
            <nut-button v-else style="height: 50rpx" shape="square" type="info">考核人员签字</nut-button>
 | 
			
		||||
          </navigator>
 | 
			
		||||
        </nut-form-item>
 | 
			
		||||
 | 
			
		||||
        <nut-form-item label="被考评学校签名:">
 | 
			
		||||
          <navigator :url="`/subPages/select/signature/signature?index=${2}`" hover-class="navigator-hover">
 | 
			
		||||
            <image v-if="_form.byAssessmentEnterprisesUnitUserSignature" :src="_form.byAssessmentEnterprisesUnitUserSignature" mode="heightFix" style="height: 80rpx"></image>
 | 
			
		||||
            <nut-button v-else style="height: 50rpx" shape="square" type="info">被考评学校负责人</nut-button>
 | 
			
		||||
          </navigator>
 | 
			
		||||
        </nut-form-item>
 | 
			
		||||
      </nut-form>
 | 
			
		||||
    </view>
 | 
			
		||||
    <view style="height: 150rpx"></view>
 | 
			
		||||
    <view style="display: flex; width: 100%; justify-content: center; position: fixed; bottom: 50rpx">
 | 
			
		||||
      <nut-button shape="round" type="info" @click="onSubmit" style="height: 80rpx; width: 702rpx; margin: 10rpx auto">确认提交</nut-button>
 | 
			
		||||
    </view>
 | 
			
		||||
  </view>
 | 
			
		||||
</template>
 | 
			
		||||
<script setup lang="ts">
 | 
			
		||||
import { IconFont } from '@nutui/icons-vue-taro'
 | 
			
		||||
import Taro, { useLoad } from '@tarojs/taro'
 | 
			
		||||
import './dailyInspection.scss'
 | 
			
		||||
import { ref, computed, reactive, watch } from 'vue'
 | 
			
		||||
import api from '@/request/index'
 | 
			
		||||
import { useDailyStore } from '@/store/daily'
 | 
			
		||||
const starRating = ref<any[]>([])
 | 
			
		||||
const store = useDailyStore()
 | 
			
		||||
const daily = computed(() => store.getdailyinspection)
 | 
			
		||||
const base64_1 = computed(() => store.get_base64_1)
 | 
			
		||||
const base64_2 = computed(() => store.get_base64_2)
 | 
			
		||||
const currentCkProjectId = ref('')
 | 
			
		||||
const submitData = ref<Item[]>([])
 | 
			
		||||
 | 
			
		||||
const _form = reactive({
 | 
			
		||||
  enterprisesUnitId: '', //企事业单位id
 | 
			
		||||
  ckProjectId: '', //考核项目
 | 
			
		||||
  assessmentUserSignature: '', //考核人员签字
 | 
			
		||||
  byAssessmentEnterprisesUnitUserSignature: '', //	被考核单位人员签字
 | 
			
		||||
  remark: '', //考核备注
 | 
			
		||||
})
 | 
			
		||||
watch(
 | 
			
		||||
  [daily, base64_1, base64_2],
 | 
			
		||||
  ([newDaily, newBase64_1, newBase64_2]) => {
 | 
			
		||||
    _form.assessmentUserSignature = newBase64_1
 | 
			
		||||
    _form.byAssessmentEnterprisesUnitUserSignature = newBase64_2
 | 
			
		||||
 | 
			
		||||
    if (newDaily.length > 0) {
 | 
			
		||||
      starRating.value = newDaily
 | 
			
		||||
    }
 | 
			
		||||
    submitData.value = newDaily
 | 
			
		||||
    console.log('watch_______________', _form, submitData.value)
 | 
			
		||||
  },
 | 
			
		||||
  { immediate: true }
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
useLoad(async () => {
 | 
			
		||||
  await getUnitEnterprisesUnitList()
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
const Onrating = function (name: string, snowFlakeId: string) {
 | 
			
		||||
  let index = starRating.value.findIndex((item) => item.snowFlakeId === snowFlakeId)
 | 
			
		||||
  Taro.navigateTo({
 | 
			
		||||
    url: `/subPages/select/dailyLife/dailyLife?name=${name}&index=${index}`,
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
interface UnitEnterprisesUnitList {
 | 
			
		||||
  label: string
 | 
			
		||||
  value: string
 | 
			
		||||
  extData: {
 | 
			
		||||
    type: {
 | 
			
		||||
      label: string
 | 
			
		||||
      value: string
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
interface CkProjectListByType {
 | 
			
		||||
  label: string
 | 
			
		||||
  value: string
 | 
			
		||||
  extData: {
 | 
			
		||||
    createTime: string
 | 
			
		||||
    remark: string
 | 
			
		||||
    totalScore: number
 | 
			
		||||
    type: {
 | 
			
		||||
      label: string
 | 
			
		||||
      value: string
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * @assessmentCriteriaRulesByCkProjectId 获取考核规则
 | 
			
		||||
 */
 | 
			
		||||
interface StandardList {
 | 
			
		||||
  ckItemId: string
 | 
			
		||||
  deductionPoints: number
 | 
			
		||||
  name: string
 | 
			
		||||
  snowFlakeId: string
 | 
			
		||||
}
 | 
			
		||||
interface ItemList {
 | 
			
		||||
  ckGroupId: string
 | 
			
		||||
  name: string
 | 
			
		||||
  remark: string
 | 
			
		||||
  snowFlakeId: string
 | 
			
		||||
  standardList: StandardList[]
 | 
			
		||||
  type: { value: string; label: string }
 | 
			
		||||
  selectedID: string
 | 
			
		||||
  selected_points: number
 | 
			
		||||
  selectedGroup: string[]
 | 
			
		||||
}
 | 
			
		||||
interface StarRating {
 | 
			
		||||
  itemList: ItemList[]
 | 
			
		||||
  name: string
 | 
			
		||||
  remark: string
 | 
			
		||||
  snowFlakeId: string
 | 
			
		||||
  totalScore: number
 | 
			
		||||
  currentScore: number
 | 
			
		||||
}
 | 
			
		||||
const assessmentCriteriaRulesByCkProjectId = async function (ckProjectId) {
 | 
			
		||||
  Taro.showLoading({
 | 
			
		||||
    title: '加载中...',
 | 
			
		||||
    mask: true,
 | 
			
		||||
  })
 | 
			
		||||
  const res = await api.get<StarRating[]>(`/assessmentCriteria/assessmentCriteriaRulesByCkProjectId`, { ckProjectId })
 | 
			
		||||
  // ————————————————————————————————————————处理数据,默认添加已选择项
 | 
			
		||||
  res.data?.forEach((item) => {
 | 
			
		||||
    item.currentScore = 0
 | 
			
		||||
 | 
			
		||||
    item.itemList.forEach((element: ItemList) => {
 | 
			
		||||
      // element.selectedID = element.standardList[0].snowFlakeId
 | 
			
		||||
      element.standardList.unshift({
 | 
			
		||||
        ckItemId: 'null',
 | 
			
		||||
        deductionPoints: 0,
 | 
			
		||||
        name: '达标',
 | 
			
		||||
        snowFlakeId: 'null',
 | 
			
		||||
      })
 | 
			
		||||
      element.selectedID = element.standardList[0].snowFlakeId
 | 
			
		||||
      element.selected_points = 0 // 默认达标 默认扣 0 分
 | 
			
		||||
      // 多选
 | 
			
		||||
      if (element.type.value === 'multiple') {
 | 
			
		||||
        element.selectedGroup = [element.selectedID]
 | 
			
		||||
      }
 | 
			
		||||
    })
 | 
			
		||||
  })
 | 
			
		||||
  starRating.value = res.data ?? [] // 如果 res.data 为 undefined,则使用空数组
 | 
			
		||||
  store.dailyinspectionList(starRating.value)
 | 
			
		||||
  Taro.hideLoading()
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * @ckProjectListByType 根据类型获取考核标准列表
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
const selectorCheckedType = ref<string>('')
 | 
			
		||||
const selectorType = ref<CkProjectListByType[]>()
 | 
			
		||||
const ckProjectListByType = async function (type) {
 | 
			
		||||
  const res = await api.get<CkProjectListByType[]>(`/assessmentCriteria/ckProjectListByType`, { type })
 | 
			
		||||
  selectorType.value = res.data
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const onChangeType = function (e: any) {
 | 
			
		||||
  let index = Number(e.detail.value)
 | 
			
		||||
  selectorCheckedType.value = selectorType.value?.[index].label as string
 | 
			
		||||
  currentCkProjectId.value = selectorType.value?.[index].value as string
 | 
			
		||||
  // let ckProjectId = selectorType.value?.[index].value
 | 
			
		||||
  assessmentCriteriaRulesByCkProjectId(currentCkProjectId.value)
 | 
			
		||||
  _form.ckProjectId = selectorType.value?.[index].value as string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const selector = ref<UnitEnterprisesUnitList[]>()
 | 
			
		||||
const selectorChecked = ref<string>('')
 | 
			
		||||
const onChange = function (e: any) {
 | 
			
		||||
  let index = Number(e.detail.value)
 | 
			
		||||
  selectorChecked.value = selector.value?.[index].label as string
 | 
			
		||||
  let type = selector.value?.[index].extData.type.value
 | 
			
		||||
  ckProjectListByType(type)
 | 
			
		||||
  _form.enterprisesUnitId = selector.value?.[index].value as string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const getUnitEnterprisesUnitList = async function () {
 | 
			
		||||
  const res = await api.get<UnitEnterprisesUnitList[]>(`/policeIndex/getUnitEnterprisesUnitList`)
 | 
			
		||||
  selector.value = res.data
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const _showToast = function (title) {
 | 
			
		||||
  Taro.showToast({
 | 
			
		||||
    title,
 | 
			
		||||
    icon: 'none',
 | 
			
		||||
    duration: 1500,
 | 
			
		||||
    mask: true,
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @onSubmit 提交
 | 
			
		||||
 */
 | 
			
		||||
/**
 | 
			
		||||
 * @assessmentRecordDetails 选择后的数据用于提交
 | 
			
		||||
 */
 | 
			
		||||
interface Item {
 | 
			
		||||
  itemList: any[] // 根据实际情况调整类型
 | 
			
		||||
  snowFlakeId: string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const assessmentRecordDetails = ref<any[]>([])
 | 
			
		||||
const onSubmit = async function () {
 | 
			
		||||
  if (_form.enterprisesUnitId === '') {
 | 
			
		||||
    _showToast('请选择企事业单位')
 | 
			
		||||
    return
 | 
			
		||||
  }
 | 
			
		||||
  if (_form.ckProjectId === '') {
 | 
			
		||||
    _showToast('请选择考核项目')
 | 
			
		||||
    return
 | 
			
		||||
  }
 | 
			
		||||
  if (_form.assessmentUserSignature === '') {
 | 
			
		||||
    _showToast('请考核人员签字')
 | 
			
		||||
    return
 | 
			
		||||
  }
 | 
			
		||||
  if (_form.byAssessmentEnterprisesUnitUserSignature === '') {
 | 
			
		||||
    _showToast('请被考核单位人员签字')
 | 
			
		||||
    return
 | 
			
		||||
  }
 | 
			
		||||
  Taro.showLoading({
 | 
			
		||||
    title: '加载中...',
 | 
			
		||||
    mask: true,
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  submitData.value.forEach((element: StarRating) => {
 | 
			
		||||
    element?.itemList.forEach((item: ItemList) => {
 | 
			
		||||
      item.standardList.forEach((ele: StandardList) => {
 | 
			
		||||
        if (ele.snowFlakeId === item.selectedID && !item.hasOwnProperty('selectedGroup') && item.selectedID != 'null') {
 | 
			
		||||
          assessmentRecordDetails.value.push({
 | 
			
		||||
            ckGroupId: element.snowFlakeId, //选项的雪花Id
 | 
			
		||||
            ckItemId: ele.ckItemId, //已选择的ID
 | 
			
		||||
            ckStandardId: item.selectedID, //已选择的雪花ID
 | 
			
		||||
          })
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
      if (item.hasOwnProperty('selectedGroup')) {
 | 
			
		||||
        item.selectedGroup.forEach((selectedItem) => {
 | 
			
		||||
          item.standardList.forEach((standard_Element) => {
 | 
			
		||||
            if (selectedItem != 'null' && selectedItem === standard_Element.snowFlakeId) {
 | 
			
		||||
              assessmentRecordDetails.value.push({
 | 
			
		||||
                ckGroupId: element.snowFlakeId, //选项的雪花Id
 | 
			
		||||
                ckItemId: standard_Element.ckItemId, //已选择的ID
 | 
			
		||||
                ckStandardId: selectedItem, //已选择的雪花ID
 | 
			
		||||
              })
 | 
			
		||||
            }
 | 
			
		||||
          })
 | 
			
		||||
        })
 | 
			
		||||
      }
 | 
			
		||||
    })
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  const assessmentRecordParams = {
 | 
			
		||||
    assessmentRecordDetails: [] as any[],
 | 
			
		||||
  }
 | 
			
		||||
  Object.assign(assessmentRecordParams, _form)
 | 
			
		||||
  assessmentRecordParams.assessmentRecordDetails = [...assessmentRecordDetails.value]
 | 
			
		||||
  console.log('🚀 ~ onSubmit ~ assessmentRecordParams:', assessmentRecordParams)
 | 
			
		||||
 | 
			
		||||
  const result = await api.post('/assessmentCriteria/submitAssessmentRecord', assessmentRecordParams)
 | 
			
		||||
  console.log('🚀 ~ onSubmit ~ result:', result)
 | 
			
		||||
  Taro.hideLoading()
 | 
			
		||||
  store.dailyinspectionList([]) //清空数据
 | 
			
		||||
  assessmentRecordDetails.value = [] //清空数据
 | 
			
		||||
  assessmentCriteriaRulesByCkProjectId(currentCkProjectId.value) //重新获取数据
 | 
			
		||||
  if (result.code === 200) {
 | 
			
		||||
    Taro.showToast({
 | 
			
		||||
      title: result.message,
 | 
			
		||||
      icon: 'success',
 | 
			
		||||
      duration: 1500,
 | 
			
		||||
      mask: true,
 | 
			
		||||
    })
 | 
			
		||||
  } else {
 | 
			
		||||
    _showToast(result.message)
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,26 @@
 | 
			
		|||
.userinform {
 | 
			
		||||
  height: 100%;
 | 
			
		||||
  width: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.userItem {
 | 
			
		||||
  color: #7b7b7b;
 | 
			
		||||
  font-size: 14px;
 | 
			
		||||
  margin-bottom: 8px;
 | 
			
		||||
 | 
			
		||||
  .textIndex {
 | 
			
		||||
    margin-left: 20rpx;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.text {
 | 
			
		||||
  width: 96%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.singleChoice {
 | 
			
		||||
  width: 90%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.label {
 | 
			
		||||
  margin: 0 20px;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
export default definePageConfig({
 | 
			
		||||
  navigationBarTitleText: '',
 | 
			
		||||
})
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,111 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <view class="userinform">
 | 
			
		||||
    <view class="userItem">
 | 
			
		||||
      <!-- v-model="item.snowFlakeId" 展开所有 -->
 | 
			
		||||
      <nut-collapse v-model="item.snowFlakeId" accordion v-for="(item, index) in starRating[findIndex].itemList" :key="item.snowFlakeId">
 | 
			
		||||
        <nut-collapse-item :name="item.snowFlakeId" :title="item.name">
 | 
			
		||||
          <view class="singleChoice">
 | 
			
		||||
            <!-- v-model="form[item.name]" -->
 | 
			
		||||
            <nut-radio-group v-if="item.type.value === 'radio'" v-model="item.selectedID" @change="(modelValue) => onChange(modelValue, item.name)">
 | 
			
		||||
              <nut-radio v-for="(items, indexs) in item.standardList" size="40" :label="items.snowFlakeId" :key="indexs"> {{ items.name }}</nut-radio>
 | 
			
		||||
            </nut-radio-group>
 | 
			
		||||
 | 
			
		||||
            <nut-checkbox-group v-else v-model="item.selectedGroup" @change="(arr) => checkboxGroupChange(arr, index)" style="display: flex; flex-direction: column">
 | 
			
		||||
              <nut-checkbox
 | 
			
		||||
                @change="(state, label) => checkboxChange(state, label)"
 | 
			
		||||
                v-for="(items, i) in item.standardList"
 | 
			
		||||
                size="40"
 | 
			
		||||
                :label="items.snowFlakeId"
 | 
			
		||||
                :key="i"
 | 
			
		||||
                style="margin-bottom: 20rpx"
 | 
			
		||||
                shape="button"
 | 
			
		||||
                >{{ items.name }}</nut-checkbox
 | 
			
		||||
              >
 | 
			
		||||
            </nut-checkbox-group>
 | 
			
		||||
          </view>
 | 
			
		||||
        </nut-collapse-item>
 | 
			
		||||
      </nut-collapse>
 | 
			
		||||
    </view>
 | 
			
		||||
  </view>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script setup>
 | 
			
		||||
import Taro, { useLoad, useUnload } from '@tarojs/taro'
 | 
			
		||||
import { ref, computed, watch } from 'vue'
 | 
			
		||||
 | 
			
		||||
import { useDailyStore } from '@/store/daily.ts'
 | 
			
		||||
const store = useDailyStore()
 | 
			
		||||
const starRating = ref([])
 | 
			
		||||
const findIndex = ref(0)
 | 
			
		||||
const airdefenceEnumdata = ref([])
 | 
			
		||||
useLoad((options) => {
 | 
			
		||||
  Taro.setNavigationBarTitle({
 | 
			
		||||
    title: options.name,
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  findIndex.value = options.index
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
const daily = computed(() => store.getdailyinspection)
 | 
			
		||||
 | 
			
		||||
watch(
 | 
			
		||||
  daily,
 | 
			
		||||
  (newData) => {
 | 
			
		||||
    starRating.value = newData
 | 
			
		||||
  },
 | 
			
		||||
  { immediate: true }
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @assessmentRecordDetails 选择后的数据用于提交
 | 
			
		||||
 */
 | 
			
		||||
const assessmentRecordDetails = ref([])
 | 
			
		||||
 | 
			
		||||
const onChange = (modelValue, name) => {
 | 
			
		||||
  starRating.value[findIndex.value].itemList.forEach((element) => {
 | 
			
		||||
    if (name === element.name) {
 | 
			
		||||
      element.selectedID = modelValue
 | 
			
		||||
      element.standardList.forEach((item) => {
 | 
			
		||||
        // console.log('item.snowFlakeId, modelValue_________________', item.snowFlakeId, modelValue)
 | 
			
		||||
        if (item.snowFlakeId == modelValue) {
 | 
			
		||||
          element.selectedName = item.name // 添加扣分选项名字 selectedName 为标识数据———————便于区分测试
 | 
			
		||||
          element.selected_points = item.deductionPoints //添加扣分项
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
    }
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
const checkboxGroupChange = function (arr, index) {
 | 
			
		||||
  // console.log('🚀 ~ checkboxGroupChange ~ arr:', arr)
 | 
			
		||||
  // console.log(index)
 | 
			
		||||
 | 
			
		||||
  // console.log(starRating.value[findIndex.value].itemList[index])
 | 
			
		||||
  let points = 0
 | 
			
		||||
  starRating.value[findIndex.value].itemList.forEach((element, i) => {
 | 
			
		||||
    if (i === index) {
 | 
			
		||||
      element.selectedGroup.forEach((selectedId) => {
 | 
			
		||||
        element.standardList.forEach((standardItem) => {
 | 
			
		||||
          if (selectedId === standardItem.snowFlakeId) {
 | 
			
		||||
            points += standardItem.deductionPoints
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
      })
 | 
			
		||||
    }
 | 
			
		||||
  })
 | 
			
		||||
  starRating.value[findIndex.value].itemList[index].selected_points = points
 | 
			
		||||
  // console.log(points)
 | 
			
		||||
  // console.log(starRating.value[findIndex.value].itemList[index].selected_points)
 | 
			
		||||
}
 | 
			
		||||
const checkboxChange = function (state, label) {
 | 
			
		||||
  // console.log('🚀 ~ checkboxChange ~ state, label:', state, label)
 | 
			
		||||
}
 | 
			
		||||
useUnload(() => {
 | 
			
		||||
  let points = 0
 | 
			
		||||
  starRating.value[findIndex.value].itemList.forEach((element) => {
 | 
			
		||||
    points += element.selected_points
 | 
			
		||||
  })
 | 
			
		||||
  starRating.value[findIndex.value].currentScore = points
 | 
			
		||||
 | 
			
		||||
  store.dailyinspectionList([...starRating.value])
 | 
			
		||||
})
 | 
			
		||||
</script>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
export default definePageConfig({
 | 
			
		||||
  navigationBarTitleText: '签名',
 | 
			
		||||
})
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,64 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <nut-signature @confirm="confirm" @clear="clear"></nut-signature>
 | 
			
		||||
  <image mode="widthFix" v-if="imgData" :src="imgData" style="width: 100%"></image>
 | 
			
		||||
</template>
 | 
			
		||||
<script setup lang="ts">
 | 
			
		||||
import { useDailyStore } from '@/store/daily'
 | 
			
		||||
const store = useDailyStore()
 | 
			
		||||
import Taro, { useLoad } from '@tarojs/taro'
 | 
			
		||||
import { ref, computed } from 'vue'
 | 
			
		||||
const base64_1 = computed(() => store.get_base64_1)
 | 
			
		||||
const base64_2 = computed(() => store.get_base64_2)
 | 
			
		||||
 | 
			
		||||
const _index = ref(0)
 | 
			
		||||
useLoad((options) => {
 | 
			
		||||
  console.log(options)
 | 
			
		||||
  _index.value = Number(options.index)
 | 
			
		||||
  if (_index.value === 1) {
 | 
			
		||||
    imgData.value = base64_1.value
 | 
			
		||||
  } else {
 | 
			
		||||
    imgData.value = base64_2.value
 | 
			
		||||
  }
 | 
			
		||||
})
 | 
			
		||||
const imgData = ref('')
 | 
			
		||||
const convertToBase64 = (imgUrl: string): Promise<string> => {
 | 
			
		||||
  return new Promise((resolve, reject) => {
 | 
			
		||||
    const fs = Taro.getFileSystemManager()
 | 
			
		||||
    fs.readFile({
 | 
			
		||||
      filePath: imgUrl, // 本地路径
 | 
			
		||||
      encoding: 'base64',
 | 
			
		||||
      success(res) {
 | 
			
		||||
        // resolve({})
 | 
			
		||||
        resolve('data:image/png;base64,' + res.data) // 前缀加上 image 类型,适应 img 标签
 | 
			
		||||
      },
 | 
			
		||||
      fail(err) {
 | 
			
		||||
        reject(err)
 | 
			
		||||
      },
 | 
			
		||||
    })
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
const confirm = async (canvas: any, data: string) => {
 | 
			
		||||
  if (data) {
 | 
			
		||||
    console.log('imgData', canvas, data)
 | 
			
		||||
    try {
 | 
			
		||||
      const base64Image = await convertToBase64(data)
 | 
			
		||||
      if (_index.value === 1) {
 | 
			
		||||
        // imgData.value = base64Image
 | 
			
		||||
        store.change_base64_1(base64Image)
 | 
			
		||||
        Taro.navigateBack({ delta: 1 })
 | 
			
		||||
      } else {
 | 
			
		||||
        // imgData.value = base64Image
 | 
			
		||||
        store.change_base64_2(base64Image)
 | 
			
		||||
        Taro.navigateBack({ delta: 1 })
 | 
			
		||||
      }
 | 
			
		||||
      // console.log('Base64 Image:', base64Image)
 | 
			
		||||
    } catch (error) {
 | 
			
		||||
      console.error('Failed to convert image to Base64:', error)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
const clear = () => {
 | 
			
		||||
  imgData.value = ''
 | 
			
		||||
  console.log('clear')
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
		Loading…
	
		Reference in New Issue