Browse Source

Merge remote-tracking branch 'origin/master'

main
parent
commit
9d26b928bd
  1. 1
      .gitignore
  2. 1
      src/assets/icons/rotate-left.svg
  3. 1
      src/assets/icons/rotate-right.svg
  4. 15
      src/components/datav/chart-bar.vue
  5. 67
      src/components/file/list.vue
  6. 52
      src/components/negative/add.vue
  7. 68
      src/components/negative/confirmation-completion.vue
  8. 8
      src/components/negative/countdown.vue
  9. 15
      src/components/negative/description.vue
  10. 1
      src/components/negative/dialog.vue
  11. 2
      src/enums/dictEnums.ts
  12. 2
      src/utils/util.ts
  13. 2
      src/views/Home.vue
  14. 19
      src/views/sensitivePerception/DepartNegative.vue
  15. 1
      src/views/system/User.vue
  16. 155
      src/views/work/Query.vue
  17. 8
      vite.config.ts

1
.gitignore vendored

@ -2,6 +2,7 @@
/node_modules/
/v2/
*.zip
.idea
package-lock.json
pnpm-lock.yaml

1
src/assets/icons/rotate-left.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1710476192729" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1635" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M541.226667 66.517333L393.045333 217.685333a21.333333 21.333333 0 0 0 0 29.866667l147.84 150.826667a21.333333 21.333333 0 0 0 28.16 2.090666l2.346667-2.090666 27.050667-27.605334a21.333333 21.333333 0 0 0 0-29.866666l-69.888-71.338667a304.64 304.64 0 1 1-318.421334 352.682667l-1.024-6.826667a176.554667 176.554667 0 0 1-0.64-5.632 21.333333 21.333333 0 0 0-22.314666-19.114667l-42.666667 2.261334a21.333333 21.333333 0 0 0-20.224 22.4l0.085333 1.024 1.194667 10.496A389.973333 389.973333 0 1 0 539.178667 184.746667l59.306666-60.458667a21.333333 21.333333 0 0 0 0-29.866667l-27.093333-27.605333a21.333333 21.333333 0 0 0-30.165333-0.298667z" p-id="1636"></path></svg>

After

Width:  |  Height:  |  Size: 976 B

1
src/assets/icons/rotate-right.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1710476185031" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1494" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M482.773333 66.517333l148.181334 151.168a21.333333 21.333333 0 0 1 0 29.866667l-147.84 150.826667a21.333333 21.333333 0 0 1-28.16 2.090666l-2.346667-2.090666-27.050667-27.605334a21.333333 21.333333 0 0 1 0-29.866666l69.888-71.338667a304.64 304.64 0 1 0 318.421334 352.682667l1.024-6.826667c0.170667-1.408 0.426667-3.285333 0.64-5.632a21.333333 21.333333 0 0 1 22.314666-19.114667l42.666667 2.261334a21.333333 21.333333 0 0 1 20.224 22.4l-0.085333 1.024-1.194667 10.496A389.973333 389.973333 0 1 1 484.821333 184.746667l-59.306666-60.458667a21.333333 21.333333 0 0 1 0-29.866667l27.093333-27.605333a21.333333 21.333333 0 0 1 30.165333-0.298667z" p-id="1495"></path></svg>

After

Width:  |  Height:  |  Size: 978 B

15
src/components/datav/chart-bar.vue

@ -5,16 +5,16 @@
</div>
<div>
<div
class="flex v-center bar-item between wrap"
class="flex v-center bar-item wrap between"
v-for="item in data"
:size="size"
:style="{ '--label-width': `${labelWidth}px` }"
:position="labelPosition"
>
<span class="bar-item-label mr-10">
<span class="bar-item-label mr-8">
{{ item.label }}
</span>
<div class="bar-item_content mr-16">
<div class="bar-item_content mr-8" :long="!item.denominator">
<div
class="bar-item_content-bar"
:style="{
@ -23,9 +23,9 @@
}"
></div>
</div>
<span class="mr-16">{{ item.value }}</span>
<span >{{ item.value }}</span>
<span
class="bar-item_remark text-right"
class="bar-item_remark text-right ml-8"
v-if="item.denominator"
style="min-width: 40px"
>
@ -154,7 +154,10 @@ function getColor(val) {
}
}
.bar-item_content {
width: calc(100% - var(--label-width) - 80px);
width: calc(100% - var(--label-width) - 16px - 20px);
&[long=false] {
width: calc(100% - var(--label-width) - 36px - 58px);
}
.bar-item_content-bar {
width: 0;
height: 9px;

67
src/components/file/list.vue

@ -64,11 +64,11 @@
<div
class="file-content flex center v-center"
@click="preview = false"
@wheel="wheel"
>
<div
class="img-container flex center"
v-if="getFileType(activeFile.fileName) === FileType.IMG"
@wheel="wheel"
>
<img
:src="`${BASE_PATH}/file/stream/${activeFile.filePath}`"
@ -84,7 +84,7 @@
/>
<button
class="rotate-left-btn pointer"
@click.stop="rotateLeft"
@click.stop.prevent="rotateLeft"
size="small"
title="左旋转"
>
@ -92,7 +92,7 @@
</button>
<button
class="rotate-right-btn pointer"
@click.stop="rotateRight"
@click.stop.prevent="rotateRight"
size="small"
title="右旋转"
>
@ -288,6 +288,67 @@ function next() {
filePreview(props.files[index + 1]);
}
}
function wheel(event) {
if (event.deltaY > 0 && scale.value > 0.5) {
scale.value -= 0.1;
}
if (event.deltaY < 0) {
scale.value += 0.1;
}
}
function mousedown() {
moveFlag = true;
initialX = event.clientX;
initialY = event.clientY;
}
function mousemove(event) {
if (!moveFlag) {
return;
}
if (rotate.value % 360 === 0) {
translateX.value += event.clientX - initialX;
translateY.value += event.clientY - initialY;
}
if (rotate.value === 90) {
translateY.value -= event.clientX - initialX;
translateX.value += event.clientY - initialY;
}
if (rotate.value === 180) {
translateX.value -= event.clientX - initialX;
translateY.value -= event.clientY - initialY;
}
if (rotate.value === 270) {
translateY.value += event.clientX - initialX;
translateX.value -= event.clientY - initialY;
}
initialX = event.clientX;
initialY = event.clientY;
}
function mouseup(event) {
moveFlag = false;
}
function rotateLeft() {
if (rotate.value === 360) {
rotate.value = 0;
} else {
rotate.value += 90;
}
}
function rotateRight() {
if (rotate.value === 0) {
rotate.value = 270;
} else {
rotate.value -= 90;
}
}
</script>
<style lang="scss" scoped>
.file-container {

52
src/components/negative/add.vue

@ -88,7 +88,47 @@
</el-select>
</el-form-item-ext>
</el-col>
</el-row>
<el-row v-if="form.problemSourcesCode === ProblemSources.ZXDC">
<el-col :span="12">
<el-form-item
label="专项督察"
prop="specialSupervision"
:rules="{
required: true,
message: '请选择专项督察',
trigger: ['blur'],
}"
>
<el-select
v-model="form.specialSupervision"
clearable
>
<el-option
v-for="item in dict.specialSupervision"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="通报期数"
prop="reportNumber"
:rules="{
required: true,
message: '请选择通报期数',
trigger: ['blur'],
}"
>
<el-input placeholder="请输入" v-model="form.reportNumber" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item
label="涉及案件/警情编号"
@ -361,6 +401,10 @@
>关联问题涉及单位</el-button
>
</div>
<div class="tips mt-10">
<p>问题涉及单位 指与该问题相关的单位</p>
<p>指定具体办理单位 指将问题分派给哪个单位办理</p>
</div>
</el-form-item>
</div>
<h2>办理时限</h2>
@ -452,8 +496,16 @@ const dict = catchStore.getDicts([
"hostLevel",
"timeLimit",
"approvalFlow",
"specialSupervision"
]);
const props = defineProps({
modeType: {
type: String,
default: 'add'
}
})
const emit = defineEmits(["close"]);
const form = ref({

68
src/components/negative/confirmation-completion.vue

@ -0,0 +1,68 @@
<template>
<el-dialog title="认定办结">
<h2>问题符文情况</h2>
<el-form>
<h3>涉及人员</h3>
<div class="row">
<div class="col col-6">
<label>姓名</label>
<span>{{ negative.responderName }}</span>
</div>
<div class="col col-6">
<label>警号</label>
<span>{{ negative.contactPhone }}</span>
</div>
<div class="col col-12">
<label>问题类型</label>
<span>{{ negative.contactPhone }}</span>
</div>
</div>
<el-form-item label="严重等级">
</el-form-item>
<h4>问题赋分</h4>
<el-row>
<el-col :span="8">
<div>问题严重等级</div>
<div>0.3严重影响 赋分增加 30%</div>
</el-col>
<el-col :span="8">
<div>问题严重等级</div>
<div>0.53 赋分增加 50%</div>
</el-col>
<el-col :span="8">
<div>问题严重等级</div>
<div>0.15问题发生率xxx xxx, 赋分增加 15%</div>
</el-col>
</el-row>
<div>
<p>一般影响当问题导致一般性投诉或轻微的内部管理问题时分值为基础分值 </p>
<p>严重影响当问题导致较大投诉或内部管理问题时分值将在基础分值的基础上增加 30%</p>
<p>重大影响当问题导致重大法律责任或产生严重负面社会影响时分值将在基础分值的基础上增加 80%</p>
</div>
<h2>问题标签设定</h2>
<p>为问题设定督察成放方面的标签方便后期根据标签快速查找相关问题设定的标签不要与问题现有属性重复</p>
<h2>认定办结情况</h2>
<el-row>
<el-col :span="12">
<el-form-item label="核查办理情况"></el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="佐证材料情况"></el-form-item>
</el-col>
</el-row>
<el-form-item label="认定办结意见">
<el-input type="textarea" />
</el-form-item>
</el-form>
<footer class="flex between v-center">
<el-button>取消</el-button>
<el-button type="primary">认定办结</el-button>
</footer>
</el-dialog>
</template>
<script setup>
</script>
<style lang="scss" scoped>
</style>

8
src/components/negative/countdown.vue

@ -28,6 +28,7 @@
</template>
</div>
<div class="tips">剩余处理时间</div>
<div class="tips mt-8" style="font-size: 12px" v-if="extensionDays > 0">延期{{ extensionDays }}</div>
</div>
</el-progress>
<div v-else class="countdown-container_danger flex center v-center column">
@ -49,7 +50,8 @@
<span></span>
</template>
</div>
<span>已超时</span>
<div>已超时</div>
<div class="mt-8 text-small" v-if="extensionDays > 0">延期{{ extensionDays }}</div>
</div>
</template>
<script setup>
@ -68,6 +70,10 @@ const props = defineProps({
type: Number,
default: 100,
},
extensionDays: {
type: Number,
default: 0
}
});
const emit = defineEmits(["update:time"]);

15
src/components/negative/description.vue

@ -34,6 +34,14 @@
<label>业务类别</label>
<span>{{ negative.businessTypeName }}</span>
</div>
<div class="col col-6" v-if="negative.specialSupervision">
<label>专项督察</label>
<span>{{ getDictLable(dict.specialSupervision, negative.specialSupervision) }}</span>
</div>
<div class="col col-6" v-if="negative.reportNumber">
<label>警情期数</label>
<span>{{ negative.reportNumber }}</span>
</div>
<div class="col col-6">
<label>涉及警种</label>
<span>{{ negative.policeTypeName }}</span>
@ -64,8 +72,13 @@
</div>
</template>
<script setup>
import { getDictLable } from "@/utils/util";
const negative = inject('negative')
import useCatchStore from "@/stores/modules/catch";
const catchSotre = useCatchStore();
const dict = catchSotre.getDicts([
"specialSupervision"
]);
</script>
<style lang="scss" scoped>
.info-container {

1
src/components/negative/dialog.vue

@ -81,6 +81,7 @@
<negative-countdown
v-model:time="remainingDuration"
:max-time="maxDuration"
:extensionDays="negative.extensionDays"
/>
</template>
<negative-action-history />

2
src/enums/dictEnums.ts

@ -55,6 +55,8 @@ export enum ProblemSources {
JZXX = '23',
// 12337信访
XF12337 = '24',
// 专项督察
ZXDC = '15',
// 其他
XF_QT = '25'
}

2
src/utils/util.ts

@ -321,7 +321,7 @@ export function getFileType(fileName) {
if (fileName.endsWith('.pdf')) {
return FileType.PDF;
}
if (fileName.endsWith('.jpg') || fileName.endsWith('.png')) {
if (fileName.endsWith('.jpg') || fileName.endsWith('.png') || fileName.endsWith('.gif')) {
return FileType.IMG;
}
if (fileName.endsWith('.doc') || fileName.endsWith('.docx')) {

2
src/views/Home.vue

@ -67,7 +67,7 @@ function goQuery(item) {
router.push('/query?processingStatus=processing')
}
if (item.icon === 'delay') {
router.push('/query?processingStatus=signing')
router.push('/query?extensionFlag=true')
}
if (item.icon === 'completedApprove') {
router.push('/query?processingStatus=approval')

19
src/views/sensitivePerception/DepartNegative.vue

@ -202,7 +202,14 @@
</el-col>
<el-col :span="18">
<el-row>
<el-col :span="12" class="mb-20" v-if="negativeInfo.jcj110BusinessSize || negativeInfo.jcj110Size">
<el-col
:span="12"
class="mb-20"
v-if="
negativeInfo.jcj110BusinessSize ||
negativeInfo.jcj110Size
"
>
<description-pair
label1="110接处警量"
label2="问题数"
@ -212,7 +219,13 @@
:value2="negativeInfo.jcj110Size"
/>
</el-col>
<el-col :span="12" v-if="negativeInfo.jcj122BusinessSize || negativeInfo.jcj122Size">
<el-col
:span="12"
v-if="
negativeInfo.jcj122BusinessSize ||
negativeInfo.jcj122Size
"
>
<description-pair
label1="122接处警量"
label2="问题数"
@ -295,7 +308,7 @@
/>
</el-col>
</el-row>
<el-row class="mb-20">
<el-row class="mb-20" :gutter="20">
<el-col :span="8">
<h5>个人问题排名</h5>
<el-scrollbar max-height="300px">

1
src/views/system/User.vue

@ -155,6 +155,7 @@
v-model="form.roleIds"
placeholder="请选择角色"
multiple
clearable
>
<el-option
v-for="item in roles"

155
src/views/work/Query.vue

@ -14,9 +14,6 @@
</el-tag>
</div>
<el-form :label-width="120">
<div class="form-row flex v-center">
<label class="text-center">常规选项</label>
<div>
<el-row>
<el-col :span="6">
<el-form-item label="问题发现时间">
@ -49,11 +46,6 @@
</el-form-item>
</el-col>
</el-row>
</div>
</div>
<div class="form-row flex v-center">
<label class="text-center">问题选项</label>
<div>
<el-row>
<el-col :span="6">
<el-form-item label="涉及单位">
@ -76,18 +68,10 @@
<el-select
v-model="query.responderKey"
style="width: 160px"
@change="
delete query.responderValue
"
@change="delete query.responderValue"
>
<el-option
value="name"
label="姓名"
/>
<el-option
value="phone"
label="电话"
/>
<el-option value="name" label="姓名" />
<el-option value="phone" label="电话" />
</el-select>
<el-input
placeholder="请输入"
@ -107,8 +91,6 @@
</el-form-item>
</el-col>
</el-row>
</div>
</div>
<query-select-row
v-for="(item, index) in queryItems"
:key="index"
@ -213,6 +195,16 @@
<el-option label="未超时" :value="false" />
<el-option label="已超时" :value="true" />
</el-select>
<el-select
size="small"
style="width: 146px"
placeholder="申请延期"
clearable
v-model="query.extensionFlag"
>
<el-option label="已申请" :value="true" />
<el-option label="未申请" :value="false" />
</el-select>
</div>
</div>
</el-form>
@ -449,11 +441,7 @@
/>
<el-dialog v-model="editShow" title="问题编辑" width="900px">
<el-form
label-width="148"
:model="formData"
ref="formRef"
>
<el-form label-width="148" :model="formData" ref="formRef">
<div style="margin-bottom: 80px">
<el-row>
<el-col :span="12">
@ -471,7 +459,8 @@
v-model="formData.problemSourcesCode"
@change="
(nodeData) =>
(formData.problemSources = nodeData.label)
(formData.problemSources =
nodeData.label)
"
/>
</el-form-item>
@ -505,7 +494,49 @@
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row v-if="form.problemSourcesCode === ProblemSources.ZXDC">
<el-col :span="12">
<el-form-item
label="专项督察"
prop="specialSupervision"
:rules="{
required: true,
message: '请选择专项督察',
trigger: ['blur'],
}"
>
<el-select
v-model="form.specialSupervision"
clearable
>
<el-option
v-for="item in dict.specialSupervision"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="通报期数"
prop="reportNumber"
:rules="{
required: true,
message: '请选择通报期数',
trigger: ['blur'],
}"
>
<el-input
placeholder="请输入"
v-model="form.reportNumber"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item
label="涉及案件/警情编号"
@ -585,14 +616,19 @@
:check-strictly="true"
@node-click="
(row) =>
(formData.involveDepartName = row.shortName)
(formData.involveDepartName =
row.shortName)
"
/>
</el-form-item>
</el-col>
</el-row>
<el-row
v-if="ProblemSources_XFTS.includes(formData.problemSourcesCode)"
v-if="
ProblemSources_XFTS.includes(
formData.problemSourcesCode
)
"
>
<el-col :span="12">
<el-form-item label="投诉反映人" prop="responderName">
@ -665,10 +701,7 @@
</el-form>
<footer class="flex end">
<el-button @click="editShow = false" size="large">取消</el-button>
<el-button
type="primary"
@click="handleSumbit"
size="large"
<el-button type="primary" @click="handleSumbit" size="large"
>确定</el-button
>
</footer>
@ -677,15 +710,17 @@
<script setup>
import moment from "moment";
import { ElLoading } from "element-plus";
import { listNegative, negativeExport, delNegative, updateNegative } from "@/api/work/negative";
import {
listNegative,
negativeExport,
delNegative,
updateNegative,
} from "@/api/work/negative";
import { getDictLable, formatTimeText, getInvolveProblem } from "@/utils/util";
import feedback from "@/utils/feedback";
import { ProcessingStatus } from "@/enums/flowEnums";
import {
ProblemSources_XFTS,
} from "@/enums/dictEnums";
import { ProblemSources_XFTS, ProblemSources } from "@/enums/dictEnums";
import useCatchStore from "@/stores/modules/catch";
@ -697,6 +732,7 @@ const dict = catchStore.getDicts([
"processingStatus",
"suspectProblem",
"policeType",
"specialSupervision",
]);
const flowNodes = catchStore.getFlowNodes();
const dictProblemSources = catchStore.getDictProblemSources();
@ -756,6 +792,11 @@ function updateQuery() {
} else {
query.value.crtTime = [];
}
if (route.query.extensionFlag === "true") {
query.value.extensionFlag = true
} else {
query.value.extensionFlag = '';
}
}
onMounted(() => {
@ -792,22 +833,42 @@ async function handleDel(row) {
getList();
}
const editShow = ref(false)
const formData = ref({})
const formRef = ref(null)
const editShow = ref(false);
const formData = ref({});
const formRef = ref(null);
function handleEdit(row) {
formData.value = {...row}
editShow.value = true
console.log(row);
editShow.value = true;
formData.value = { ...row };
if (row.involveProblem) {
formData.value.involveProblem = JSON.parse(row.involveProblem);
formData.value.involveProblemCode = JSON.parse(row.involveProblem).map(
(item) => item.dictValue
);
}
}
async function handleSumbit() {
await formRef.value.validate()
await updateNegative(formData.value)
editShow.value = false
await formRef.value.validate();
await updateNegative(formData.value);
editShow.value = false;
feedback.msgSuccess("操作成功");
getList();
}
function handleSelectInvolveProblem(vals) {
formData.value.involveProblem = vals.map((val) => {
const dictItem = dict.suspectProblem.filter(
(item) => item.dictValue === val
)[0];
return {
dictType: "suspectProblem",
dictLabel: dictItem.dictLabel,
dictValue: dictItem.dictValue,
};
});
}
</script>
<style lang="scss" scoped>
.form-row {

8
vite.config.ts

@ -70,10 +70,10 @@ export default ({ mode }) => {
},
postcss: {
plugins: [
postCssPxToRem({
rootValue: 192,
propList: ['*'],
})
// postCssPxToRem({
// rootValue: 192,
// propList: ['*'],
// })
]
}
},

Loading…
Cancel
Save