// ==UserScript==
// @name GiteePlus
// @version 1.6.0
// @description 企业版Gitee增强
// @author Kason
// @grant GM_addStyle
// @grant unsafeWindow
// @grant GM_notification
// @grant GM_xmlhttpRequest
// @license MIT
// @match https://e.gitee.com/*
// @icon https://e.gitee.com/assets/images/favicon.ico
// @namespace https://greasyfork.org/users/1186291
// ==/UserScript==
(function () {
"use strict";
let script = document.createElement("script");
script.setAttribute("type", "text/javascript");
script.src = "https://cdn.jsdelivr.net/npm/vue@3";
document.documentElement.appendChild(script);
let link = document.createElement("link");
link.setAttribute("rel", "stylesheet");
link.href = "https://cdn.jsdelivr.net/npm/element-plus/dist/index.css";
document.documentElement.appendChild(link);
let fontAwesome = document.createElement("link");
fontAwesome.setAttribute("rel", "stylesheet");
fontAwesome.href =
"https://cdn.bootcdn.net/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css";
document.documentElement.appendChild(fontAwesome);
let elscript = document.createElement("script");
elscript.setAttribute("type", "text/javascript");
elscript.src = "https://cdn.jsdelivr.net/npm/element-plus";
document.documentElement.appendChild(elscript);
let sortableScript = document.createElement("script");
sortableScript.setAttribute("type", "text/javascript");
sortableScript.src =
"https://cdn.bootcdn.net/ajax/libs/Sortable/1.15.0/Sortable.min.js";
sortableScript.async = true;
document.documentElement.appendChild(sortableScript);
window.onload = () => {
// 样式单独抽离管理
let app_styles = `position: absolute;
display: flex;
justify-content: flex-start;
top: 58px;
left: 240px;
z-index:2;
align-items: flex-start;
margin-top: 5px;`;
let badge_style = `margin-top: 10px;margin-right: 40px;`;
let week_time_style = `text-align: center;margin-left: 70px;cursor: pointer;`;
let last_week_time_style = `text-align: center;margin-left: 60px;cursor: pointer;`;
let calendar_style = `position: absolute;top: 53px;width: 500px; right: -160px;text-align: center;`;
let calendat_body_style = `margin-top:2px;`;
let text = `<div id="app" style="${app_styles};">
<el-tooltip class="box-item" effect="light" content="所有任务/需求/Bug" placement="bottom">
<el-badge :value="sun_count" v-if="show_status" style="${badge_style};"><el-tag>总任务</el-tag></el-badge>
</el-tooltip>
<el-tooltip class="box-item" effect="light" content="24小时内将超时" placement="bottom">
<el-badge :value="deadline_count" v-if="show_status" style="${badge_style};"><el-tag type="warning">临期任务</el-tag></el-badge>
</el-tooltip>
<el-tooltip class="box-item" effect="light" content="已延期" placement="bottom">
<el-badge :value="expired_count" v-if="show_status" style="${badge_style};"><el-tag>延 期</el-tag></el-badge>
</el-tooltip>
<el-badge :value="feature_count" v-if="show_status" type="primary" style="${badge_style};"><el-tag >需 求</el-tag></el-badge>
<el-badge :value="task_count" v-if="show_status" type="primary" style="${badge_style};"><el-tag>任 务</el-tag></el-badge>
<el-badge :value="bug_count" v-if="show_status" type="warning" style="${badge_style};"><el-tag>Bug</el-tag></el-badge>
<el-popover placement="bottom" :width="360" trigger="hover" :popper-style="{ 'border-radius': '15px','cursor': 'pointer'}">
<template #reference>
<el-statistic style="${last_week_time_style}" v-if="show_status" title="上周工时(标准:40)" :value="last_work_time" @mouseenter="fetchTableData(0)">
<template #suffix >
<el-icon style="vertical-align: -0.125em">
<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-v-ea893728=""><path fill="currentColor" d="M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768zm0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896z"></path><path fill="currentColor" d="M480 256a32 32 0 0 1 32 32v256a32 32 0 0 1-64 0V288a32 32 0 0 1 32-32z"></path><path fill="currentColor" d="M480 512h256q32 0 32 32t-32 32H480q-32 0-32-32t32-32z"></path></svg>
</el-icon>
</template>
</el-statistic>
</template>
<el-table border stripe max-height="196" ref="tableRef" size="small" @selection-change="handleSelectionChange" :header-cell-style="{'text-align':'center'}" :cell-style="{'text-align':'center'}" :data="gridData" :table-layout="tableLayout">
<el-table-column prop="xq" label="星期" width="85">
<template #default="scope">
<el-tag
effect="light"
disable-transitions
>
{{ scope.row.xq }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="rq" label="日期" width="85" ></el-table-column>
<el-table-column prop="gs" label="工时" width="54">
<template #default="scope">
<div :style="{ color: (scope.row.gs > 8 ? 'red' : (scope.row.gs >= 0 && scope.row.gs <= 8 ? '#099877' : '')) }">{{ scope.row.gs }}</div>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="110">
<template #default="scope">
<el-button link type="primary" size="small" @click="handleDetail(scope.row.xq, scope.row.rq, scope.row.gs,0)">详情</el-button>
</template>
</el-table-column>
</el-table>
</el-popover>
<el-popover placement="bottom" :width="360" trigger="hover" :popper-style="{ 'border-radius': '15px','cursor': 'pointer'}">
<template #reference>
<el-statistic style="${week_time_style}" v-if="show_status" title="本周工时(标准:40)" :value="work_time" @mouseenter="fetchTableData(1)">
<template #suffix >
<el-icon style="vertical-align: -0.125em" >
<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-v-ea893728=""><path fill="currentColor" d="M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768zm0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896z"></path><path fill="currentColor" d="M480 256a32 32 0 0 1 32 32v256a32 32 0 0 1-64 0V288a32 32 0 0 1 32-32z"></path><path fill="currentColor" d="M480 512h256q32 0 32 32t-32 32H480q-32 0-32-32t32-32z"></path></svg>
</el-icon>
</template>
</el-statistic>
</template>
<el-table border stripe max-height="196" ref="tableRef" size="small" @selection-change="handleSelectionChange" :header-cell-style="{'text-align':'center'}" :cell-style="{'text-align':'center'}" :data="gridData" :table-layout="tableLayout">
<el-table-column prop="xq" label="星期" width="85">
<template #default="scope">
<el-tag
effect="light"
disable-transitions
>
{{ scope.row.xq }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="rq" label="日期" width="85" ></el-table-column>
<el-table-column prop="gs" label="工时" width="54">
<template #default="scope">
<div :style="{ color: (scope.row.gs > 8 ? 'red' : (scope.row.gs >= 0 && scope.row.gs <= 8 ? '#099877' : '')) }">{{ scope.row.gs }}</div>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="110">
<template #default="scope">
<el-button link type="primary" size="small" @click="handleDetail(scope.row.xq, scope.row.rq, scope.row.gs,1)">详情</el-button>
</template>
</el-table-column>
</el-table>
</el-popover>
<el-calendar ref="calendar" style="${calendar_style}" v-model="selectedDate" @mouseover="showCalendar = true" @mouseleave="showCalendar = false" v-show="showCalendar" :range="dateRange">
<template #date-cell="{ data }">
<div v-show="isInAllDate( data.day.split('-').slice(0).join('-') )" style="${calendat_body_style};">{{ data.day.split('-').slice(1).join('-') }}</div>
<svg v-if="!isSpecifiedDate( data.day.split('-').slice(0).join('-') )&&isInAllDate( data.day.split('-').slice(0).join('-') )" style="${calendat_body_style};" t="1696519254340" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1893" width="20" height="20"><path d="M666.32 727.28L554.08 944.8a36.24 36.24 0 0 1-48.88 15.6c-7.12-3.68-12.8-9.52-16.16-16.8L384.64 722.24c-5.12-10.8-15.2-18.4-26.96-20.32L116.16 662.4a36.24 36.24 0 0 1-29.92-41.68c1.28-7.84 5.12-15.12 10.96-20.56l178.24-167.68a36.32 36.32 0 0 0 11.04-31.92l-37.12-241.92a36.264 36.264 0 0 1 53.36-37.28l214.56 117.68c10.48 5.76 23.12 5.92 33.76 0.56L769.6 129.6a36.24 36.24 0 0 1 51.92 39.2l-45.68 240.48c-2.24 11.76 1.44 23.84 9.84 32.32l172.16 173.92a36.264 36.264 0 0 1-0.24 51.28c-5.68 5.6-13.04 9.2-20.96 10.16l-242.8 30.88c-11.68 1.6-22.08 8.8-27.52 19.44z" fill="#bfbfbf" p-id="1894"></path><path d="M655.2 709.36l-104.4 202.4a33.8 33.8 0 0 1-45.52 14.56 33.824 33.824 0 0 1-15.04-15.6L393.04 704.72a33.744 33.744 0 0 0-25.12-18.96l-224.8-36.8a33.88 33.88 0 0 1-27.92-38.8c1.2-7.36 4.8-14.08 10.16-19.12l165.92-156.08a33.768 33.768 0 0 0 10.24-29.68l-34.48-225.2a33.784 33.784 0 0 1 28.24-38.48c7.36-1.12 14.88 0.24 21.36 3.76l199.76 109.52c9.76 5.36 21.52 5.52 31.44 0.56l203.44-102.4a33.792 33.792 0 0 1 48.4 36.48l-42.48 223.76c-2.08 10.88 1.36 22.16 9.2 30.08l160.24 161.84a33.752 33.752 0 0 1-0.24 47.76c-5.28 5.2-12.08 8.56-19.44 9.52L680.96 691.2a34.152 34.152 0 0 0-25.76 18.16z" fill="#bfbfbf" p-id="1895"></path><path d="M118.48 631.44l388.16-161.76 5.2 457.6a33.704 33.704 0 0 1-22.96-18.48L391.68 702.72a33.88 33.88 0 0 0-25.12-18.96l-224.8-36.72a33.504 33.504 0 0 1-23.28-15.6z m676.8-465.28c3.36 6.64 4.4 14.16 3.04 21.52l-42.48 223.76c-2.08 10.96 1.36 22.16 9.2 30.08l160.24 161.84c9.6 9.68 12.4 24.08 7.2 36.64L506.64 469.6l278.08-315.84c4.32 3.2 8 7.36 10.56 12.4z" fill="#bfbfbf" p-id="1896"></path></svg>
<svg v-if="isSpecifiedDate( data.day.split('-').slice(0).join('-') )" style="${calendat_body_style};" t="1696518710705" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1608" width="20" height="20"><path d="M666.32 727.28L554.08 944.8a36.24 36.24 0 0 1-48.88 15.6c-7.12-3.68-12.8-9.52-16.16-16.8L384.64 722.24c-5.12-10.8-15.2-18.4-26.96-20.32L116.16 662.4a36.24 36.24 0 0 1-29.92-41.68c1.28-7.84 5.12-15.12 10.96-20.56l178.24-167.68a36.32 36.32 0 0 0 11.04-31.92l-37.12-241.92a36.264 36.264 0 0 1 53.36-37.28l214.56 117.68c10.48 5.76 23.12 5.92 33.76 0.56L769.6 129.6a36.24 36.24 0 0 1 51.92 39.2l-45.68 240.48c-2.24 11.76 1.44 23.84 9.84 32.32l172.16 173.92a36.264 36.264 0 0 1-0.24 51.28c-5.68 5.6-13.04 9.2-20.96 10.16l-242.8 30.88c-11.68 1.6-22.08 8.8-27.52 19.44z" fill="#6E6E96" p-id="1609"></path><path d="M655.2 709.36l-104.4 202.4a33.8 33.8 0 0 1-45.52 14.56 33.824 33.824 0 0 1-15.04-15.6L393.04 704.72a33.744 33.744 0 0 0-25.12-18.96l-224.8-36.8a33.88 33.88 0 0 1-27.92-38.8c1.2-7.36 4.8-14.08 10.16-19.12l165.92-156.08a33.768 33.768 0 0 0 10.24-29.68l-34.48-225.2a33.784 33.784 0 0 1 28.24-38.48c7.36-1.12 14.88 0.24 21.36 3.76l199.76 109.52c9.76 5.36 21.52 5.52 31.44 0.56l203.44-102.4a33.792 33.792 0 0 1 48.4 36.48l-42.48 223.76c-2.08 10.88 1.36 22.16 9.2 30.08l160.24 161.84a33.752 33.752 0 0 1-0.24 47.76c-5.28 5.2-12.08 8.56-19.44 9.52L680.96 691.2a34.152 34.152 0 0 0-25.76 18.16z" fill="#FECD34" p-id="1610"></path><path d="M118.48 631.44l388.16-161.76 5.2 457.6a33.704 33.704 0 0 1-22.96-18.48L391.68 702.72a33.88 33.88 0 0 0-25.12-18.96l-224.8-36.72a33.504 33.504 0 0 1-23.28-15.6z m676.8-465.28c3.36 6.64 4.4 14.16 3.04 21.52l-42.48 223.76c-2.08 10.96 1.36 22.16 9.2 30.08l160.24 161.84c9.6 9.68 12.4 24.08 7.2 36.64L506.64 469.6l278.08-315.84c4.32 3.2 8 7.36 10.56 12.4z" fill="#FEA935" p-id="1611"></path></svg>
<div v-if="isInAllDate( data.day.split('-').slice(0).join('-') )" style="${calendat_body_style};">{{ registered_map[data.day] || 0 }}</div>
</template>
</el-calendar>
<el-dialog v-model="showTable" width="800" draggable :show-close="false" :style="{ 'border-radius': '15px' }">
<div slot="title" style="margin-top: -10px;font-size: 17px;font-weight: 800;margin-bottom: 10px; display: flex;align-items: center;flex-direction: row;justify-content: space-between;">任务选择|刷新任务状态<span><el-tooltip class="box-item" effect="dark" content="选中后,将直接推送周报内容" placement="left"><el-checkbox v-model="push">直接推送</el-checkbox></el-tooltip><span></div>
<el-table border stripe max-height="250" ref="tableRef" @selection-change="handleSelectionChange" :header-cell-style="{'text-align':'center'}" :cell-style="{'text-align':'center'}" :data="tableData" :table-layout="tableLayout">
<el-table-column type="selection" label="序号" width="35"></el-table-column>
<el-table-column prop="title" label="任务名称" width="555" show-overflow-tooltip></el-table-column>
<el-table-column prop="assignee" label="任务负责人" width="95">
<template #default="scope">
<el-avatar :src="scope.row.assignee.avatar_url" style="background: white; width:20px; height:20px"></el-avatar>
</template>
</el-table-column>
<el-table-column prop="issue_state.title" label="状态"></el-table-column>
</el-table>
<el-input
v-model="textarea"
style="width: 100%"
:rows="4"
type="textarea"
placeholder="稍等,我有话要说! 可重复补充信息\n 例如:在xxx任务中,虽然完成了,但是遇到了xxx困难,请求大佬支援...\n 例如:在本周任务中,我学会了xxx技能,并在飞书分享相关文档\n 例如:我遇到了些问题:1.新的技术;2.服务器问题"></el-input>
<div style="display: flex; justify-content: center;">
<el-button :loading="pushLoading" type="primary" style="margin: 15px;" @click="chatAI">
<i class="fa fa-paper-plane"></i> GO GPT!
</el-button>
<el-button :loading="pushGiteeLoading" type="primary" style="margin: 15px;" @click="pushHtml">
<i class="fa fa-envelope"></i> 发送周报
</el-button>
</div>
<el-input
v-model="textareaByAI"
style="width: 100%;height:auto"
v-if="textareaByAIShow"
type="textarea"
:rows="6"
placeholder=""></el-input>
</el-dialog>
<el-dialog v-model="showIssueTable" width="800" draggable :show-close="false" :style="{ 'z-index': '99999', 'border-radius': '15px' }">
<div slot="title" style="margin-top: -10px;font-size: 20px;margin-left: 50px;margin-right: 50px;font-weight: 800;margin-bottom: 12px; display: flex;align-items: center;flex-direction: row;justify-content: space-between;">
<span>{{xq}}</span>
<span>时间:{{rq}}</span>
<span>总工时:{{gs}}</span>
</div>
<el-table border stripe max-height="450" ref="tableRef" :header-cell-style="{'text-align':'center'}" :cell-style="{'text-align':'center'}" :data="tableIssueData" :table-layout="tableLayout">
<el-table-column prop="issue_type.title" label="类型" width="150"></el-table-column>
<el-table-column prop="title" label="任务" width="350" show-overflow-tooltip></el-table-column>
<el-table-column prop="gs" label="工时"></el-table-column>
<el-table-column label="跳转">
<template #default="scope">
<a @click="openNewTab(scope.row.link)" style="cursor: pointer;">前往查看</a>
</template>
</el-table-column>
</el-table>
</el-dialog>
</div>`;
var el = document.createElement("div");
el.innerHTML = text;
document.body.append(el);
// 登录人对象
class assignee {
constructor() {
this.data = {
id: null,
username: null,
name: null,
remark: null,
pinyin: null,
avatar_url: null,
is_enterprise_member: null,
is_history_member: null,
outsourced: null,
};
}
}
// 创建者对象
class author {
constructor() {
this.data = {
id: null,
username: null,
name: null,
remark: null,
pinyin: null,
avatar_url: null,
is_enterprise_member: null,
is_history_member: null,
outsourced: null,
};
}
}
// 任务类型
class issue_type {
constructor() {
this.data = {
id: null,
title: null,
template: null,
ident: null,
color: null,
is_system: null,
created_at: null,
updated_at: null,
category: null,
description: null,
};
}
}
// 任务状态
class issue_state {
constructor() {
this.data = {
id: null,
title: null,
color: null,
icon: null,
command: null,
serial: null,
issue_types: [new issue_type()],
created_at: null,
updated_at: null,
};
}
}
// 工作项数据
class issue_data {
constructor() {
this.total_count = 0;
this.data = [
{
id: null,
root_id: null,
parent_id: null,
project_id: null,
ident: null,
title: null,
issue_state_id: null,
program_id: null,
state: null,
comments_count: null,
priority: null,
branch: null,
priority_human: null,
assignee: new assignee(),
duration: null,
created_at: null,
updated_at: null,
collaborators: [],
author: new author(),
milestone: null,
issue_state: new issue_state(),
issue_type: new issue_type(),
labels: [],
issue_extra: [],
plan_started_at: null,
deadline: null,
finished_at: null,
started_at: null,
security_hole: null,
is_star: null,
kanban_info: null,
estimated_duration: null,
// 任务单登记时间
registered_duration: 0,
},
];
}
}
const App = {
data() {
return {
roult_path: null,
message: "Hello Gitee Plus",
elements: null,
work_time: 0,
last_work_time: 0,
issurDataTotal: null,
show_status: true,
sun_count: 0,
deadline_count: 0,
task_count: 0,
feature_count: 0,
bug_count: 0,
expired_count: 0,
calendar: null,
dateRange: null,
registered_map: {},
selectedDate: new Date(), // 添加选中的日期
showCalendar: false, // 控制日历组件的显示
tableData: [], // 任务表格数据
tableIssueData: [], // 工时表格数据
showTable: false, // 表格可见开关
showIssueTable: false, // 工时任务可见开关
dialogTableVisible: true,
tableLayout: "fixed",
selectionDatas: [], // 选中数据集合
textarea: "", // 补充内容文本域
push: false, // 直接推送开关
pushLoading: false, // loading开关
parentMessageId: 0, //上一次消息id
textareaByAI: "", // AI返回文本域
textareaByAIShow: false, //AI文本域展示开关
pushGiteeLoading: false,
gridData: [],
xq: "",
rq: "",
gs: ""
};
},
mounted() {
this.gridData = [
{
rq: '',
xq: '星期一',
gs: '',
},
{
rq: '',
xq: '星期二',
gs: '',
},
{
rq: '',
xq: '星期三',
gs: '',
},
{
rq: '',
xq: '星期四',
gs: '',
},
{
rq: '',
xq: '星期五',
gs: '',
},
{
rq: '',
xq: '星期六',
gs: '',
},
{
rq: '',
xq: '星期天',
gs: '',
},
],
// 获取当前公司的路由前缀
this.getRoluteStr()
.then((result) => {
this.roult_path = result.id;
})
.catch(function (error) {
console.error("Gitee客户端异常,获取公司路由失败");
});
// 设置左侧标题为会员,右侧多余按钮
this.hideComp();
// 页面可见性的改变
document.addEventListener("visibilitychange", () => {
if (document.visibilityState === "visible") {
this.showNotification(
"Hi " +
JSON.parse(localStorage.getItem("gitee.user")).userInfo.name,
"欢迎回来 GiteePlus"
);
console.log("当前页面在浏览器打开标签");
// TODO 获取焦点,主动获取一次通知中,是否存在新的任务,如果有新的任务,将和上次离开时间对比,共有多少任务派出
// TODO 计算出任务数量,并显示在页面中
} else {
// TODO 页面进入后台,进行新的修改 记录时间
}
});
// 路由判定
window.addEventListener("popstate", (event) => {
if (window.location.pathname.includes("dashboard")) {
this.show_status = true;
} else {
this.show_status = false;
}
});
// 周报滚动条显示
this.$nextTick(async () => {
try {
const { current_week, last_week } = await this.get_week_reports();
await this.send_todo_num_request();
if (
(last_week.id != null && current_week.id == null) ||
(last_week.id != undefined && current_week.id == undefined)
) {
const article = document.createElement("div");
article.setAttribute("id", "team-members");
article.innerHTML =
`
<article class="team-member">
<img
class="team-member-avatar"
src="`+ JSON.parse(localStorage.getItem("gitee.user")).userInfo.avatar_url + `"
alt="Team Member"
/>
<div class="team-member-name">
<h3>周报汇报</h3>
<p>本周周报还没写</p>
</div>
<ul class="social-links">
<a class="zb" href="#"><i class="fa-solid fa-calendar"></i></a>
</ul>
</article>
<article class="team-member">
<div class="team-member-name">
<h3>贴心通知</h3>
<p>24h内需完成任务, 共 ` +
this.deadline_count +
` 条</p>
</div>
<ul class="social-links">
<li>
<a href="#"><i class="fa-solid fa-ellipsis" style="color: #f3de53;"></i></a>
</li>
</ul>
</article>
<article class="team-member">
<div class="team-member-name">
<h3>超时提醒</h3>
<p>当前累计超时单, 共 ` +
this.expired_count +
` 条</p>
</div>
<ul class="social-links">
<li>
<a href="#"><i class="fa-solid fa-bell" style="color: #de7cc9;"></i></a>
</li>
</ul>
</article>
`;
let style = document.createElement("style");
style.innerHTML = `
h3{
margin: 0;
}
#team-members {
display: flex;
font-size: 1rem;
background-position: center center;
background-size: cover;
display: flex;
flex-direction: column;
gap: 16px;
width: 100%;
max-width: 550px;
margin: auto;
padding: 50px;
background: rgba(255, 255, 255, 0.25);
backdrop-filter: blur(10px);
border-radius: 10px;
border: 1px solid rgba(255, 255, 255, 0.08);
filter: drop-shadow(0px 20px 10px rgba(0, 0, 0, 0.3));
}
.team-member {
position: relative;
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 5px;
min-height: 60px;
padding-top: 4px;
padding-bottom: 4px;
padding-left: 15px;
padding-right: 15px;
background-color: #ffffff;
border-radius: 25px;
font-size: large;
z-index: 1;
}
.team-member:hover {
cursor: grab;
}
.team-member-avatar {
width: 3.75rem;
height: 3.75rem;
object-fit: cover;
border-radius: 50%;
}
.team-member-name {
display: grid;
gap: 0.125rem;
}
.team-member-name h3 {
color: #2a70dc;
font-size: large;
}
.team-member-name p {
font-size: smaller;
}
.team-member-chosen {
box-shadow: 8px 8px 32px rgba(0, 0, 0, 0.3);
}
.team-member-drag {
opacity: 0;
}
.social-links {
display: flex;
flex-direction: row;
gap: 6px;
margin-left: auto;
padding: 0;
list-style-type: none;
}
.social-links i {
width: 1.25rem;
height: 1.25rem;
font-size: 1.25rem;
}
`;
document.head.appendChild(style);
this.addWeekReportTips(article);
new Sortable(article, {
animation: 350,
chosenClass: "team-member-chosen",
dragClass: "team-member-drag",
});
const currentDate = new Date();
const currentDay = currentDate.getDay();
if (currentDay >= 5) {
// TODO 对今天是周五的情况下,且周报也未获取到,继续处理
}
}
// 去除不写周报的提示
} catch (error) {
console.error("Gitee客户端异常,获取周报失败");
}
this.$nextTick(() => {
const img = document.querySelector(".zb");
if (img) {
img.addEventListener("click", this.showTableData);
}
});
});
this.send_todo_num_request()
.then((issue_str) => {
return this.send_issue_data_request(issue_str);
})
.then((issue) => {
// 处理返回的 issue 数据
this.issurDataTotal = issue;
// 获取到的数据
this.sun_count = this.issurDataTotal.total_count;
if (
this.issurDataTotal.total_count != 0 &&
this.issurDataTotal.data.length > 0
) {
for (let info of this.issurDataTotal.data) {
// 截止时间
if (info.deadline != null) {
var currentTime = new Date();
if (new Date(info.deadline) >= currentTime) {
var time = this.get_hour_difference(info.deadline);
if (time != null && time <= 24) {
this.deadline_count++;
}
} else {
// 逾期任务
this.expired_count++;
}
}
// 将数据分类,摘选出需求/任务/bug
if (info.issue_type.id == 626337) {
this.bug_count++;
}
if (info.issue_type.id == 626336) {
this.feature_count++;
}
const validIssueTypeIds = new Set([
16690, 662615, 757073, 757074, 766555,
]);
if (validIssueTypeIds.has(info.issue_type.id)) {
this.task_count++;
}
}
// 调用element-plus的通知,可以等待通知消息接收到再处理
if (this.deadline_count > 0) {
this.$notify({
title: "贴心通知",
type: "warning",
message:
"注意!您有24小时内需完成的任务,共 " +
this.deadline_count +
" 条",
position: "bottom-right",
showClose: false,
offset: 50,
duration: 3000,
});
}
}
})
.catch((error) => {
console.error("Gitee客户端异常", error);
});
// 工时获取,本周工时,上周工时
this.get_week_time()
.then((result) => {
if (result != null) {
var dates = result.dates;
var all_registered_duration = result.all_registered_duration;
var daily_registered_duration_count =
result.daily_registered_duration_count;
this.work_time = all_registered_duration;
// 设置期限为本周
this.allDate = dates;
this.dateRange = [new Date(dates[0]), new Date(dates[6])];
var registered_count = [];
for (let i = 0; i < dates.length; i++) {
var key = dates[i].replace(/"/g, "");
var value = daily_registered_duration_count[key];
registered_count[key] = value;
}
this.registered_map = registered_count;
}
})
.catch(function (error) {
console.error("Gitee客户端异常,获取工时失败");
});
this.get_last_week_time()
.then((result) => {
if (result != null) {
var all_registered_duration = result.all_registered_duration;
this.last_work_time = all_registered_duration;
}
})
.catch(function (error) {
console.error("Gitee客户端异常,获取工时失败");
});
// 获取截止到本周日的所有工作任务,排除需求,并赋值给talbeData
this.send_issue_week_data_request();
},
methods: {
// 查看任务和工时分布情况
handleDetail(xq, rq, gs, type) {
this.tableIssueData = [];
this.showIssueTable = true;
this.xq = xq;
this.rq = rq;
this.gs = gs;
var enterprisePath = localStorage.getItem("enterprisePath");
if (type == 1) {
// 拿到日期和工时,重新打开弹窗表格,显示当前内容
for (const key in this.tableData) {
// 获取任务的编码
const id = this.tableData[key].id;
// 发送请求,获取登记工时日志
this.getWorkLog(id).then((result) => {
const data_list = result.data;
if (data_list.length != 0) {
for (const _key in data_list) {
if (data_list[_key].registered_at == rq) {
this.tableData[key].gs = data_list[_key].duration
this.tableData[key].link = "https://e.gitee.com/" + enterprisePath + "/dashboard?issue=" + this.tableData[key].ident + "&issue_detail_tab=work-time"
this.tableIssueData.push(this.tableData[key])
}
}
}
})
.catch(function (error) {
console.error("Gitee客户端异常,获取本周任务列表工时");
});
}
} else {
this.getIssuseLastWeekDataByUserAndPlanTime().then((result) => {
// 获取到上周的任务列表
const last_data_list = result.data;
for (const key in last_data_list) {
// 获取任务的编码
const id = last_data_list[key].id;
// 发送请求,获取登记工时日志
this.getWorkLog(id).then((result) => {
const data_list = result.data;
if (data_list.length != 0) {
for (const _key in data_list) {
if (data_list[_key].registered_at == rq) {
last_data_list[key].gs = data_list[_key].duration
last_data_list[key].link = "https://e.gitee.com/" + enterprisePath + "/dashboard?issue=" + last_data_list[key].ident + "&issue_detail_tab=work-time"
this.getPrograms().then((result) => {
const programs_list = result.data;
for (const program_key in programs_list) {
if (programs_list[program_key].id == last_data_list[key].program_id) {
// 继续发送请求,获取任务的类型列表
this.getIssuseTypeByProgram(programs_list[program_key].id).then((result) => {
const issuseType_list = result.data;
for (const type in issuseType_list) {
if (issuseType_list[type].id == last_data_list[key].issue_type_id) {
last_data_list[key].issue_type = {
title: issuseType_list[type].title
};
this.tableIssueData.push(last_data_list[key])
}
}
}).catch(function (error) {
console.error("Gitee客户端异常,获取项目任务类型异常");
});
}
}
}).catch(function (error) {
console.error("Gitee客户端异常,获取项目异常");
});
}
}
}
})
.catch(function (error) {
console.error("Gitee客户端异常,获取本周任务列表工时");
});
}
})
.catch(function (error) {
console.error("Gitee客户端异常,获取上周任务列表工时");
});
}
},
openNewTab(url) {
window.open(url, '_blank');
},
// 鼠标浮动,重新获取数据
fetchTableData(type) {
if (type === 1) {
// 当前属于获取本周的登记的工时详情
this.get_week_time()
.then((result) => {
if (result != null) {
var dates = result.dates;
var daily_registered_duration_count =
result.daily_registered_duration_count;
for (const key in dates) {
this.gridData[key].rq = dates[key]
this.gridData[key].gs = daily_registered_duration_count[this.gridData[key].rq]
}
}
})
.catch(function (error) {
console.error("Gitee客户端异常,获取工时失败");
});
} else {
// 当前属于获取上周的工时详情
this.get_last_week_time()
.then((result) => {
if (result != null) {
var dates = result.dates;
var all_registered_duration = result.daily_registered_duration_count;
for (const key in dates) {
this.gridData[key].rq = dates[key]
this.gridData[key].gs = all_registered_duration[this.gridData[key].rq]
}
}
})
.catch(function (error) {
console.error("Gitee客户端异常,获取工时失败");
});
}
},
// 获取当前选中的选项
handleSelectionChange(selection) {
// 此处能够获取到当前选中的数据,我们可以通过将数据保存在一个新的数组中
this.selectionDatas = selection;
for (let index = 0; index < this.selectionDatas.length; index++) {
const element = this.selectionDatas[index];
console.log(element);
}
},
// 显示任务清单表格
showTableData() {
this.showTable = !this.showTable;
},
// 隐藏多余按钮
display_none_btn() {
this.elements = document.querySelectorAll(
".ge-app-top-right .ge-app-top-nav"
);
for (let i = 0; i < this.elements.length; i++) {
if (i === 0 || i === 1 || i === 3) {
this.elements[i].style.display = "none";
}
}
},
// 创建GoogleChrome软件系统通知显示,需要开通GoogleChrome的通知权限
showNotification(title, message) {
var notification = new unsafeWindow.Notification(title, {
body: message,
icon: "https://e.gitee.com/assets/images/favicon.ico",
});
setTimeout(function () {
notification.close();
}, 4000);
},
// 获取周报状态
get_week_reports() {
const _this = this; // 保存正确的上下文
const currentYear = new Date().getFullYear();
return new Promise(function (resolve, reject) {
_this
.getRoluteStr()
.then(function () {
const xhr = new XMLHttpRequest();
xhr.open(
"GET",
"https://api.gitee.com/enterprises/" +
_this.roult_path +
"/week_reports/my_reports?year=" +
currentYear,
true
);
// 设置XMLHttpRequest自动获取Cookie
xhr.withCredentials = true;
xhr.onload = function () {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
const respbody = JSON.parse(xhr.responseText);
const current_week = respbody.data[0];
const last_week = respbody.data[1];
resolve({
current_week: current_week,
last_week: last_week,
});
} else {
reject("Gitee客户端异常");
}
}
};
xhr.onerror = function () {
reject("周报获取异常");
};
// 发送请求
xhr.send(null);
})
.catch(function (error) {
reject(error);
});
});
},
// 获取todo_num数量
send_todo_num_request() {
const _this = this;
return new Promise(async function (resolve, reject) {
await _this.getRoluteStr();
var xhr = new XMLHttpRequest();
xhr.open(
"GET",
"https://api.gitee.com/enterprises/" +
_this.roult_path +
"/issues/stat_count?todo=true&today=true&week=true&overdue=true&star=true&all=true",
true
);
// 设置XMLHttpRequest 自动获取Cookie
xhr.withCredentials = true;
xhr.onload = function (e) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
var respbody = JSON.parse(xhr.responseText);
var issue_str = respbody.todo;
resolve(issue_str); // 将获取到的值传递给 Promise 的 resolve 方法
} else {
reject("Gitee客户端异常");
}
}
};
xhr.onerror = function (e) {
reject("信息获取异常");
};
// 发送请求
xhr.send(null);
});
},
// 获取任务总集合
send_issue_data_request(todo_nums) {
const _this = this;
return new Promise(async function (resolve, reject) {
await _this.getRoluteStr();
var xhr = new XMLHttpRequest();
xhr.open(
"GET",
"https://api.gitee.com/enterprises/" +
_this.roult_path +
"/issues?state=open,progressing&only_related_me=1&page=1&offset=0&per_page=" +
todo_nums,
true
);
// 设置XMLHttpRequest 自动获取Cookie
xhr.withCredentials = true;
xhr.onload = function (e) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
var work_json = xhr.responseText;
var issueData = new issue_data();
issueData = JSON.parse(work_json);
var issue = Object.assign(new issue_data(), issueData);
resolve(issue);
} else {
reject("Gitee客户端异常");
}
}
};
xhr.onerror = function (e) {
reject("信息获取异常");
};
// 发送请求
xhr.send(null);
});
},
// 获取本周任务总集合
send_issue_week_data_request() {
const _this = this;
return new Promise(async function (resolve, reject) {
await _this.getRoluteStr();
var xhr = new XMLHttpRequest();
xhr.open(
"GET",
"https://api.gitee.com/enterprises/" +
_this.roult_path +
"/issues?deadline_type=week&only_related_me=1",
true
);
// 设置XMLHttpRequest 自动获取Cookie
xhr.withCredentials = true;
xhr.onload = function (e) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
var work_json = xhr.responseText;
var issueData = new issue_data();
issueData = JSON.parse(work_json);
for (let index = 0; index < issueData.data.length; index++) {
const element = issueData.data[index];
// 需要是自己的任务
if (
element.assignee.id ==
JSON.parse(localStorage.getItem("gitee.user")).userInfo.id
) {
// 不需要计算需求类型
if (element.issue_type.id != 626336) {
_this.tableData.push(element);
}
}
}
var issue = Object.assign(new issue_data(), issueData);
resolve(issue);
} else {
reject("Gitee客户端异常");
}
}
};
xhr.onerror = function (e) {
reject("信息获取异常");
};
// 发送请求
xhr.send(null);
});
},
// 计算时间差
get_hour_difference(deadline) {
var currentTime = new Date();
var specifiedTime = new Date(deadline);
if (currentTime <= specifiedTime) {
var diffMs = specifiedTime - currentTime;
var diffHours = Math.floor(diffMs / 1000 / 60 / 60);
return diffHours;
}
return null;
},
// 获取工时状态
get_week_time() {
// 获取当前日期
var currentDate = new Date();
// 获取当前日期是一周中的第几天(0-6,其中0表示星期日)
var currentDay = currentDate.getDay();
// 计算当前一周的第一天和最后一天的日期
var firstDayOfWeek = new Date(
currentDate.setDate(currentDate.getDate() - currentDay + 1)
);
var lastDayOfWeek = new Date(
currentDate.setDate(currentDate.getDate() - currentDay + 7)
);
// 创建一个数组来存储一周的日期
var weekDates = [];
// 循环获取一周的日期并将其存入数组
for (var i = 0; i <= 6; i++) {
var date = new Date(firstDayOfWeek);
date.setDate(firstDayOfWeek.getDate() + i);
weekDates.push(date);
}
// 遍历时间,格式化日期为"YYYY-MM-DD"的格式
var formattedDates = weekDates.map(function (date) {
var year = date.getFullYear();
var month = ("0" + (date.getMonth() + 1)).slice(-2);
var day = ("0" + date.getDate()).slice(-2);
return year + "-" + month + "-" + day;
});
// 当前一周的日期,传入工时接口
const _this = this;
return new Promise(async function (resolve, reject) {
await _this.getRoluteStr();
var xhr = new XMLHttpRequest();
xhr.open(
"GET",
"https://api.gitee.com/enterprises/" +
_this.roult_path +
"/statistics/user_daily_workloads_overview?search=" +
JSON.parse(localStorage.getItem("gitee.user")).userInfo
.username +
"&start_date=" +
formattedDates[0] +
"&end_date=" +
formattedDates[6],
true
);
xhr.withCredentials = true;
xhr.onload = function (e) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
var respbody = JSON.parse(xhr.responseText);
var all_registered_duration =
respbody.all_registered_duration;
var daily_registered_duration_count =
respbody.daily_registered_duration_count;
var dates = respbody.dates;
resolve({
all_registered_duration: all_registered_duration,
daily_registered_duration_count:
daily_registered_duration_count,
dates: dates,
});
} else {
reject("Gitee客户端异常");
}
}
};
xhr.onerror = function (e) {
reject("工时获取异常");
};
xhr.send(null);
});
},
// 获取上周的工时
get_last_week_time() {
// 获取当前日期
var currentDate = new Date();
// 计算上周的第一天和最后一天的日期
var firstDayOfLastWeek = new Date(
currentDate.setDate(
currentDate.getDate() - currentDate.getDay() - 6
)
);
// 创建一个数组来存储上周的日期
var weekDates = [];
// 循环获取上周的日期并将其存入数组
for (var i = 0; i <= 6; i++) {
var date = new Date(firstDayOfLastWeek);
date.setDate(firstDayOfLastWeek.getDate() + i);
weekDates.push(date);
}
// 遍历时间,格式化日期为"YYYY-MM-DD"的格式
var formattedDates = weekDates.map(function (date) {
var year = date.getFullYear();
var month = ("0" + (date.getMonth() + 1)).slice(-2);
var day = ("0" + date.getDate()).slice(-2);
return year + "-" + month + "-" + day;
});
// 当前一周的日期,传入工时接口
const _this = this;
return new Promise(async function (resolve, reject) {
await _this.getRoluteStr();
var xhr = new XMLHttpRequest();
xhr.open(
"GET",
"https://api.gitee.com/enterprises/" +
_this.roult_path +
"/statistics/user_daily_workloads_overview?search=" +
JSON.parse(localStorage.getItem("gitee.user")).userInfo
.username +
"&start_date=" +
formattedDates[0] +
"&end_date=" +
formattedDates[6],
true
);
xhr.withCredentials = true;
xhr.onload = function (e) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
var respbody = JSON.parse(xhr.responseText);
var all_registered_duration =
respbody.all_registered_duration;
var daily_registered_duration_count =
respbody.daily_registered_duration_count;
var dates = respbody.dates;
resolve({
all_registered_duration: all_registered_duration,
daily_registered_duration_count:
daily_registered_duration_count,
dates: dates,
});
} else {
reject("上周工时获取异常");
}
}
};
xhr.onerror = function (e) {
reject("上周工时获取异常");
};
xhr.send(null);
});
},
showCalendarOnMouseover() {
this.showCalendar = true;
},
isSpecifiedDate(date) {
// 根据你的指定日期进行判断逻辑
var current_time = new Date(date);
const specifiedDate = new Date();
// 分别获取日期对象的年、月、日
const yearMatched =
current_time.getFullYear() === specifiedDate.getFullYear();
const monthMatched =
current_time.getMonth() === specifiedDate.getMonth();
const dayMatched = current_time.getDate() === specifiedDate.getDate();
// 判断年、月、日是否都匹配
return yearMatched && monthMatched && dayMatched;
},
isInAllDate(dateTime) {
// 获取当前日期
var currentDate = new Date();
// 获取当前日期是一周中的第几天(0-6,其中0表示星期日)
var currentDay = currentDate.getDay();
// 计算当前一周的第一天和最后一天的日期
var firstDayOfWeek = new Date(
currentDate.setDate(currentDate.getDate() - currentDay + 1)
);
var lastDayOfWeek = new Date(
currentDate.setDate(currentDate.getDate() - currentDay + 7)
);
// 创建一个数组来存储一周的日期
var weekDates = [];
// 循环获取一周的日期并将其存入数组
for (var i = 0; i <= 6; i++) {
var date = new Date(firstDayOfWeek);
date.setDate(firstDayOfWeek.getDate() + i);
weekDates.push(date);
}
// 格式化日期为"YYYY-MM-DD"的格式
var formattedDates = weekDates.map(function (date) {
var year = date.getFullYear();
var month = ("0" + (date.getMonth() + 1)).slice(-2);
var day = ("0" + date.getDate()).slice(-2);
return year + "-" + month + "-" + day;
});
if (formattedDates.includes(dateTime)) {
return true;
} else {
return false;
}
},
getRoluteStr() {
const _this = this;
return new Promise(function (resolve, reject) {
var enterprisePath = localStorage.getItem("enterprisePath");
var xhr = new XMLHttpRequest();
xhr.open(
"GET",
"https://api.gitee.com/enterprises/basic_info?enterprise_path=" +
enterprisePath,
true
);
xhr.withCredentials = true;
xhr.onload = function (e) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
var respbody = JSON.parse(xhr.responseText);
var enterprises = respbody.enterprises;
const result = enterprises.find(
(obj) => obj.path === enterprisePath
);
resolve({ id: result.id });
} else {
reject("公司id获取异常");
}
}
};
xhr.onerror = function (e) {
reject("上周工时获取异常");
};
xhr.send(null);
});
},
getNoUseElement() {
return new Promise((resolve, reject) => {
const observer = new MutationObserver((mutationsList, observer) => {
const element = document.querySelector(
".level-label.level-label--standard"
);
const avator = document.querySelector(".nav-item.user");
const reportView = document.querySelector(".reports-view");
const topNav = document.querySelectorAll(
".ge-app-top-right .ge-app-top-nav"
);
if (element && avator && topNav && reportView) {
observer.disconnect(); // 停止观察DOM变化
resolve({ element, avator, topNav, reportView });
}
});
observer.observe(document.body, {
attributes: true,
childList: true,
subtree: true,
});
setTimeout(() => {
observer.disconnect();
reject(new Error("超时,未找到组件"));
}, 5000);
});
},
async hideComp() {
try {
const { element, avator, topNav, reportView } =
await this.getNoUseElement();
element.innerHTML = "Plus";
element.style.background = "linear-gradient(90deg,#c9e7ff,#f3bc4c)";
element.style.fontSize = "16px";
element.style.color = "#093978";
const svgContainer = document.createElement("div");
svgContainer.innerHTML = `<svg t="1696521690855" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="14197" width="16" height="16"><path d="M308.586 388.462c10.932 6.596 25.134 3.01 31.496-7.902 33.666-57.784 92.488-158.71 131.688-225.968 17.562-30.122 61.848-30.122 79.408 0 39.2 67.26 98.024 168.184 131.712 225.968 6.362 10.912 20.564 14.5 31.472 7.902 57.792-34.924 123.604-78.328 173.824-112.194 32.056-21.624 75.466 2.736 71.568 40.698-12.946 126.192-39.312 349.476-76.764 499.802-5.286 21.168-17.764 39.334-38.864 46.166-40.656 13.126-132.452 30.666-332.64 30.666-195.328 0-287.46-16.688-329.594-29.702-23.206-7.168-36.354-27.306-41.418-50.646-36.69-169.816-62.832-376.206-76.18-495.084-4.28-38.124 39.31-62.924 71.544-41.19 50.086 33.762 115.382 76.804 172.748 111.484z" fill="#FCBF28" p-id="14198"></path><path d="M646.4 602.4c0 33.6-100.8 179.2-134.4 179.2-33.6 0-134.4-145.6-134.4-179.2 0-33.6 100.8-179.2 134.4-179.2 33.6 0 134.4 145.6 134.4 179.2z" fill="#FFFFFF" p-id="14199"></path></svg>`;
avator.appendChild(svgContainer);
avator.style.position = "relative";
svgContainer.style.position = "absolute";
svgContainer.style.top = "3px";
svgContainer.style.left = "12px";
for (let i = 0; i < topNav.length; i++) {
if (i === 0 || i === 1 || i === 3) {
topNav[i].style.display = "none";
}
}
reportView.style.display = "flex";
} catch (error) {
console.error(error);
}
},
getWeekReportElement() {
return new Promise((resolve, reject) => {
const element = document.querySelector(".reports-view");
const ele = document.querySelector(".markdown-body.text-disabled");
if (element && ele) {
resolve({ element, ele });
} else {
const observer = new MutationObserver(
(mutationsList, observer) => {
const element = document.querySelector(".reports-view");
const ele = document.querySelector(
".markdown-body.text-disabled"
);
if (element && ele) {
observer.disconnect();
resolve({ element, ele });
}
}
);
observer.observe(document.body, {
attributes: true,
childList: true,
subtree: true,
});
setTimeout(() => {
observer.disconnect();
reject(new Error("超时,未找到组件"));
}, 10000);
}
});
},
// api信息
chatAI() {
const _this = this; // 保存正确的上下文
_this.pushLoading = true;
var datas = _this.selectionDatas //选中的数据
var sendStr = "";
var respHtml = "";
_this.textarea // 文本域数据
_this.push // 直接推送开关
// 根据上面条件,进行逻辑处理
if (datas) {
for (let index = 0; index < datas.length; index++) {
const element = datas[index];
sendStr = sendStr + "完成了" + element.title + ";\n"
}
}
// 追加文本域内容
sendStr += _this.textarea + "\n下面,请按照我给的周报模版,根据上面的信息,给我生成一份精美的周报,丰富我的语句,语言表达简单清楚。除了周报模版的内容,不要输出多余的字\n### 本周工作总结\n1.\n2.\n#### 存在问题\n1.\n2.\n### 下周工作计划\n1.\n2.\n#### 需要支持\n1.\n2.";
var dataToSend = {
prompt: sendStr,
options: {
parentMessageId: ""
},
systemMessage: "You are ChatGPT, a large language model trained by OpenAI. Follow the user's instructions carefully. Respond using markdown.",
temperature: 0.8,
top_p: 1
};
GM_xmlhttpRequest({
method: 'POST',
url: 'http://w9.xjai.cc/api/chat-process',
data: JSON.stringify(dataToSend),
headers: {
'Content-Type': 'application/json'
},
onload: function (response) {
if (response.status === 200) {
const resp = response.responseText;
let splittedText = resp.split("&KFw6loC9Qvy&");
let separator = '_______________________';
let codeStr = '希望以上内容能够为您清晰地呈现本周工作情况和下周计划,谢谢!';
const splitStr = splittedText[1].split(separator)[0].trim()
respHtml = splitStr.split(codeStr)[0].trim();
_this.textareaByAIShow = true;
_this.textareaByAI = respHtml;
if (_this.push) {
// 获取今天的日期
let now = new Date();
// 获取当前年份
let currentYear = now.getFullYear();
// 获取今年的第一天
let startOfYear = new Date(now.getFullYear(), 0, 1);
// 计算今天是今年的第几天
let diff = now.getTime() - startOfYear.getTime();
let oneDay = 1000 * 60 * 60 * 24;
let dayOfYear = Math.floor(diff / oneDay) + 1;
// 计算今天是第几周
let weekNumber = Math.ceil(dayOfYear / 7);
var xhr = new XMLHttpRequest();
const contentText = {
content: respHtml,
pull_request_ids: [],
issue_ids: [],
event_ids: []
}
xhr.open(
"PUT",
"https://api.gitee.com/enterprises/" + _this.roult_path + "/week_reports/" + JSON.parse(localStorage.getItem("gitee.user")).userInfo.username + "/" + currentYear + "/" + weekNumber,
true
);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.withCredentials = true;
xhr.onload = function (e) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
_this.pushLoading = false;
_this.showTable = !_this.showTable;
_this.$message({
type: "success",
message: "周报推送成功"
});
} else {
_this.pushLoading = false;
_this.$message({
type: "error",
message: "周报推送失败"
});
}
}
};
xhr.onerror = function (e) {
};
xhr.send(JSON.stringify(contentText));
} else {
_this.pushLoading = false;
}
} else {
_this.pushLoading = false;
console.error('GPT网络异常:', response.status);
}
},
onerror: function (err) {
_this.pushLoading = false;
console.error('发送错误,请重试', err);
}
});
},
// 发送周报
pushHtml() {
const _this = this; // 保存正确的上下文
_this.pushGiteeLoading = true;
// 获取今天的日期
let now = new Date();
// 获取当前年份
let currentYear = now.getFullYear();
// 获取今年的第一天
let startOfYear = new Date(now.getFullYear(), 0, 1);
// 计算今天是今年的第几天
let diff = now.getTime() - startOfYear.getTime();
let oneDay = 1000 * 60 * 60 * 24;
let dayOfYear = Math.floor(diff / oneDay) + 1;
// 计算今天是第几周
let weekNumber = Math.ceil(dayOfYear / 7);
var xhr = new XMLHttpRequest();
const contentText = {
content: _this.textareaByAI,
pull_request_ids: [],
issue_ids: [],
event_ids: []
}
xhr.open(
"PUT",
"https://api.gitee.com/enterprises/" + _this.roult_path + "/week_reports/" + JSON.parse(localStorage.getItem("gitee.user")).userInfo.username + "/" + currentYear + "/" + weekNumber,
true
);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.withCredentials = true;
xhr.onload = function (e) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
_this.pushGiteeLoading = false;
_this.showTable = !_this.showTable;
_this.$message({
type: "success",
message: "周报推送成功"
});
} else {
_this.pushGiteeLoading = false;
_this.$message({
type: "error",
message: "周报推送失败"
});
}
}
};
xhr.onerror = function (e) {
};
xhr.send(JSON.stringify(contentText));
},
getWorkLog(id) {
const _this = this;
return new Promise(function (resolve, reject) {
_this.getRoluteStr()
var xhr = new XMLHttpRequest();
xhr.open(
"GET",
"https://api.gitee.com/enterprises/" +
_this.roult_path + "/issues/" + id + "/workloads/logs",
true
);
xhr.withCredentials = true;
xhr.onload = function (e) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
var respbody = JSON.parse(xhr.responseText);
resolve({ data: respbody.data });
} else {
reject("任务单工时获取异常");
}
}
};
xhr.onerror = function (e) {
reject("任务单工时获取异常");
};
xhr.send(null);
});
},
getPrograms() {
const _this = this;
return new Promise(function (resolve, reject) {
_this.getRoluteStr()
var xhr = new XMLHttpRequest();
xhr.open(
"GET",
"https://api.gitee.com/enterprises/" +
_this.roult_path + "/programs",
true
);
xhr.withCredentials = true;
xhr.onload = function (e) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
var respbody = JSON.parse(xhr.responseText);
resolve({ data: respbody.data });
} else {
reject("公司项目获取异常");
}
}
};
xhr.onerror = function (e) {
reject("公司项目获取异常");
};
xhr.send(null);
});
},
getIssuseTypeByProgram(programId) {
const _this = this;
return new Promise(function (resolve, reject) {
_this.getRoluteStr()
var xhr = new XMLHttpRequest();
xhr.open(
"GET",
"https://api.gitee.com/enterprises/" +
_this.roult_path + "/issue_types/program_issue_types?program_id=" + programId,
true
);
xhr.withCredentials = true;
xhr.onload = function (e) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
var respbody = JSON.parse(xhr.responseText);
resolve({ data: respbody.data });
} else {
reject("公司项目获取异常");
}
}
};
xhr.onerror = function (e) {
reject("公司项目获取异常");
};
xhr.send(null);
});
},
getIssuseLastWeekDataByUserAndPlanTime() {
// 获取当前日期
const today = new Date();
// 获取今天是周几,周日为0,周一为1,依次类推
const currentDayOfWeek = today.getDay();
// 计算上周周一和周日的日期
const lastWeekMonday = new Date(today);
lastWeekMonday.setDate(today.getDate() - currentDayOfWeek - 6);
const lastWeekSunday = new Date(today);
lastWeekSunday.setDate(today.getDate() - currentDayOfWeek);
// 格式化日期为指定格式
function formatDate(date) {
const year = date.getFullYear();
const month = (date.getMonth() + 1).toString().padStart(2, '0');
const day = date.getDate().toString().padStart(2, '0');
return `${year}.${month}.${day}`;
}
// 获取格式化后的日期范围
const lastWeekStart = formatDate(lastWeekMonday);
const lastWeekEnd = formatDate(lastWeekSunday);
const timeBetween = `${lastWeekStart}-${lastWeekEnd}`;
const userId = JSON.parse(localStorage.getItem("gitee.user")).userInfo.id;
// 当前用户信息
const _this = this;
var params = {
"filter_conditions": [
{ "property": "issue_plan_date", "comparator": "between", "value": timeBetween }
, { "property": "issue_assignee", "comparator": "contains", "value": [userId] }
],
"mode": "tree",
"result_version": "v2"
};
return new Promise(function (resolve, reject) {
_this.getRoluteStr()
var xhr = new XMLHttpRequest();
xhr.open(
"POST",
"https://api.gitee.com/enterprises/" +
_this.roult_path + "/issues/as_table",
true
);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.withCredentials = true;
xhr.onload = function (e) {
if (xhr.readyState === 4) {
if (xhr.status === 201) {
var respbody = JSON.parse(xhr.responseText);
resolve({ data: respbody.issues });
}
}
};
xhr.onerror = function (e) {
};
xhr.send(JSON.stringify(params));
})
},
async addWeekReportTips(marquee) {
try {
const { element, ele } = await this.getWeekReportElement();
element.appendChild(marquee);
ele.style.display = "none";
} catch (error) {
console.error(error);
}
},
},
};
const app = Vue.createApp(App);
app.use(ElementPlus);
app.mount("#app");
};
})();