c5_labsci/web/ambap/project.php

579 lines
21 KiB
PHP

<?php
namespace web\ambap;
global $db;
class Project {
static function setwhere($db, $post) {
$query = $post->get('query');
$csql = new \ciy\sql('lab_rproject');
if (isset($query['name']) && !empty(trim($query['name']))) {
$csql->where('name LIKE ?', '%' . trim($query['name']) . '%');
}
if (isset($query['rcate']) && $query['rcate'] > 0) {
$csql->where('rcate = ?', $query['rcate']);
}
if (isset($query['rprojectstatus']) && $query['rprojectstatus'] > 0) {
$csql->where('rprojectstatus = ?', $query['rprojectstatus']);
}
if (isset($query['direction']) && $query['direction'] > 0) {
$csql->where('direction = ?', $query['direction']);
}
$liid = $post->getint('liid', 0);
if ($liid > 0) {
$csql->where('rcate = ?', $liid);
}
$csql->order('recordtime DESC');
return [$query, $csql];
}
public static function json_list() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
list($where, $csql) = self::setwhere($db, $post);
$pageno = $post->getint('pageno', 1);
$pagecount = $post->getint('pagecount', 10);
try {
$countSqlObj = new \ciy\sql($csql->table);
$countSqlObj->column('COUNT(*) as cnt');
$countSqlObj->where($csql->where, $csql->tsmt);
$countSqlObj->order('');
$countSqlObj->selecttail('');
$countResult = $db->getone($countSqlObj);
$total = $countResult['cnt'];
$listSql = new \ciy\sql('lab_rproject p');
$listSql->column('p.*, (
SELECT GROUP_CONCAT(u.name SEPARATOR ", ")
FROM lab_projectmember pm_sub
LEFT JOIN lab_user u ON pm_sub.uid = u.id
WHERE pm_sub.pid = p.id
) AS member_names');
//$listSql->column('p.*');
$listSql->where($csql->where, $csql->tsmt);
//$listSql->selecttail('LEFT JOIN lab_projectmember pm ON p.id = pm.pid');
//$listSql->selecttail('LEFT JOIN lab_user u ON pm.uid = u.id');
//$listSql->selecttail('GROUP BY p.id');
$listSql->order($csql->order);
$listSql->limit($pageno, $pagecount);
$rows = $db->get($listSql);
// --- 修复:确保 $rows 是一个数组 ---
if ($rows === false) {
$rows = [];
}
$list_count = count($rows);
$ret = [
'searchwhere' => $where,
'pageno' => $pageno,
'pagecount' => $pagecount,
'count' => $total,
'list' => $rows
];
$ret['debug_console'] = [
'raw_db_count' => $total,
'raw_db_list_count' => $list_count,
'sql_where_clause' => $csql->where,
'sql_params' => $csql->tsmt,
'sql_order_clause' => $csql->order,
];
if ($post->getbool('once')) {
$ret['once'] = true;
$ret['lis'] = getcatas($db, 'rcate');
$input = [];
$input[] = [
'type' => 'input',
'form' => 'name',
'name' => '课题标题',
'prop' => ' style="width:10em;"'
];
$input[] = [
'type' => 'select',
'form' => 'rprojectstatus',
'name' => '项目状态',
'select' => 'rprojectstatus',
'all' => '全部'
];
$ret['searchinput'] = $input;
}
$orgSql = new \ciy\sql('lab_orgbase');
$orgList = $db->get(csql: $orgSql);
$ret['laborg'] = $orgList ?: [];
return succjson($ret);
} catch (\Exception $e) {
return errjson('查询列表失败:' . $e->getMessage());
}
}
public static function json_addinit() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
$id = $post->getint('id');
if ($post->get('act') == 'edit') {
$userSql = new \ciy\sql('lab_user');
$userList = $db->get($userSql);
$ret['users'] = $userList ?: [];
$orgSql = new \ciy\sql('lab_orgbase');
$orgList = $db->get($orgSql);
$ret['orgs'] = $orgList ?: [];
$memberSql = new \ciy\sql('lab_projectmember m');
$memberSql->column('m.id as mid, m.pid, m.uid, u.name AS uname, m.prole, m.ctime, m.utime')
->where('m.pid = ?', $id)
->selecttail('LEFT JOIN lab_user u ON m.uid = u.id');
$members = $db->get($memberSql);
$ret['members'] = $members ?: [];
$ret['rcate'] = getcatas($db, 'rcate');
$ret['rprojectstatus'] = getcatas($db, 'rprojectstatus');
$ret['direction'] = getcatas($db, 'direction');
$ret['isweb'] = getcatas($db, 'isweb');
$ret['mdeptlevel'] = getcatas($db, 'mdeptlevel');
$ret['prole'] = getcatas($db, 'prole');
$ret['principal_id']=getcatas($db,'principal_id');
}
return succjson($ret);
}
public static function json_info() {
global $db;
$post = new \ciy\post();
$id = $post->getint('id');
if ($id <= 0) {
return errjson('请传入有效的项目ID');
}
$csql = new \ciy\sql('lab_rproject');
$csql->where('id = ?', $id);
$row = $db->getone($csql);
if (!is_array($row)) {
return errjson('项目数据不存在');
}
$ret['data'] = $row;
$userSql = new \ciy\sql('lab_user');
$userList = $db->get($userSql);
$ret['users'] = $userList ?: [];
$orgSql = new \ciy\sql('lab_orgbase');
$orgList = $db->get($orgSql);
$ret['orgs'] = $orgList ?: [];
// --- 修改后的代码:使用 getraw 执行原始 SQL ---
$members = $db->getraw(
"SELECT m.id as mid, m.pid, m.uid, u.name as uname, m.prole, m.ctime, m.utime
FROM lab_projectmember m
LEFT JOIN lab_user u ON m.uid = u.id
WHERE m.pid = ?",
[$id]
);
// 将结果赋值给 $ret 数组
$ret['members'] = $members ?: [];
// --- 修改结束 ---
$ret['rcate'] = getcatas($db, 'rcate');
$ret['rprojectstatus'] = getcatas($db, 'rprojectstatus');
$ret['direction'] = getcatas($db, 'direction');
$ret['isweb'] = getcatas($db, 'isweb');
$ret['mdeptlevel'] = getcatas($db, 'mdeptlevel');
$ret['prole'] = getcatas($db, 'prole');
return succjson($ret);
}
public static function json_add() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
$recordno = $post->get('recordno');
$laborgid = $post->getint('laborgid', 0);
$isweb = $post->getint('isweb', 0);
$rcate = $post->getint('rcate', 0);
$name = $post->get('name');
$descs = $post->get('descs');
$mdeptname = $post->get('mdeptname');
$mdeptlevel = $post->getint('mdeptlevel', 0);
$budgetmoney = $post->getint('budgetmoney', 0);
$serviceorg = $post->get('serviceorg');
$principal_id = $post->getint('principal_id', 0);
$rprojectstatus = $post->getint('rprojectstatus', 0);
$progress = $post->getint('progress', 0);
$lasttimes = $post->getint('lasttimes', 0);
$latestcontent = $post->get('latestcontent');
$latestattachment = $post->get('latestattachment');
$direction = $post->getint('direction', 0);
if (empty($name)) {
return errjson('课题标题不能为空');
}
if (empty($recordno)) {
return errjson('备案编号不能为空');
}
if ($laborgid > 0) {
$checkOrgSql = new \ciy\sql('lab_orgbase');
$checkOrgSql->where('id = ?', $laborgid);
if (!$db->getone($checkOrgSql)) {
return errjson('所选机构不存在');
}
}
if ($principal_id > 0) {
$checkUserSql = new \ciy\sql('lab_user');
$checkUserSql->where('id = ?', $principal_id);
if (!$db->getone($checkUserSql)) {
return errjson('所选负责人不存在');
}
}
$currentTime = time();
$insertData = [
'recordtime' => $currentTime,
'recordno' => $recordno,
'laborgid' => $laborgid,
'orgname' => '',
'isweb' => $isweb,
'rcate' => $rcate,
'name' => $name,
'descs' => $descs,
'mdeptname' => $mdeptname,
'mdeptlevel' => $mdeptlevel,
'budgetmoney' => $budgetmoney,
'serviceorg' => $serviceorg,
'principal_id' => $principal_id,
'principal_name' => '',
'rprojectstatus' => $rprojectstatus,
'progress' => $progress,
'lasttimes' => $lasttimes,
'latestcontent' => $latestcontent,
'latestattachment' => $latestattachment,
'direction' => $direction
];
try {
$db->begin();
$projectSql = new \ciy\sql('lab_rproject');
if ($db->insert($projectSql, $insertData) === false) {
throw new \Exception('新增项目失败: ' . $db->error);
}
$projectId = $db->insert_id();
if ($laborgid > 0) {
$orgSql = new \ciy\sql('lab_orgbase');
$orgSql->where('id = ?', $laborgid);
$orgInfo = $db->getone($orgSql);
if ($orgInfo) {
$updateOrgNameSql = new \ciy\sql('lab_rproject');
$updateOrgNameSql->where('id = ?', $projectId);
$db->update($updateOrgNameSql, [
'orgname' => $orgInfo['name'],
'orgshortname' => $orgInfo['shortname'] ?? $orgInfo['name']
]);
}
}
if ($principal_id > 0) {
$userSql = new \ciy\sql('lab_user');
$userSql->where('id = ?', $principal_id);
$userInfo = $db->getone($userSql);
if ($userInfo) {
$updatePrincipalNameSql = new \ciy\sql('lab_rproject');
$updatePrincipalNameSql->where('id = ?', $projectId);
$db->update($updatePrincipalNameSql, [
'principal_name' => $userInfo['name']
]);
}
}
if ($principal_id > 0) {
$memberInsertData = [
'pid' => $projectId,
'uid' => $principal_id,
'prole' => 10,
'ctime' => $currentTime,
'utime' => $currentTime
];
$memberSql = new \ciy\sql('lab_projectmember');
if ($db->insert($memberSql, $memberInsertData) === false) {
throw new \Exception('添加项目负责人到成员列表失败: ' . $db->error);
}
}
$db->commit();
$insertData['id'] = $projectId;
savelogdb($db, $rsuser['id'], 'lab_rproject', null, $insertData);
return succjson(['id' => $projectId, 'name' => $name]);
} catch (\Exception $e) {
$db->rollback();
return errjson($e->getMessage());
}
}
public static function json_update() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
$id = $post->getint('id');
if ($id <= 0) {
return errjson('请传入有效的项目ID');
}
$csql = new \ciy\sql('lab_rproject');
$csql->where('id = ?', $id);
$originalData = $db->getone($csql);
if (!is_array($originalData)) {
return errjson('项目数据不存在');
}
$recordno = $post->get('recordno');
$laborgid = $post->getint('laborgid', 0);
$isweb = $post->getint('isweb', 0);
$rcate = $post->getint('rcate', 0);
$name = $post->get('name');
$descs = $post->get('descs');
$mdeptname = $post->get('mdeptname');
$mdeptlevel = $post->getint('mdeptlevel', 0);
$budgetmoney = $post->getint('budgetmoney', 0);
$serviceorg = $post->get('serviceorg');
$principal_id = $post->getint('principal_id', 0);
$rprojectstatus = $post->getint('rprojectstatus', 0);
$progress = $post->getint('progress', 0);
$lasttimes = $post->getint('lasttimes', 0);
$latestcontent = $post->get('latestcontent');
$latestattachment = $post->get('latestattachment');
$direction = $post->getint('direction', 0);
$newMembers = $post->get('members', []);
if (empty($name)) {
return errjson('课题标题不能为空');
}
if (empty($recordno)) {
return errjson('备案编号不能为空');
}
if ($laborgid > 0) {
$checkOrgSql = new \ciy\sql('lab_orgbase');
$checkOrgSql->where('id = ?', $laborgid);
if (!$db->getone($checkOrgSql)) {
return errjson('所选机构不存在');
}
}
if ($principal_id > 0) {
$checkUserSql = new \ciy\sql('lab_user');
$checkUserSql->where('id', $principal_id);
if (!$db->getone($checkUserSql)) {
return errjson('所选负责人不存在');
}
}
$rawProleOptions = getcatas($db, 'prole');
$validProleIds = array_column($rawProleOptions, 'id');
foreach ($newMembers as $member) {
$prole = $member['prole'] ?? 10;
if (!in_array($prole, $validProleIds)) {
return errjson("成员角色ID无效: $prole");
}
}
$updateData = [
'recordno' => $recordno,
'laborgid' => $laborgid,
'isweb' => $isweb,
'rcate' => $rcate,
'name' => $name,
'descs' => $descs,
'mdeptname' => $mdeptname,
'mdeptlevel' => $mdeptlevel,
'budgetmoney' => $budgetmoney,
'serviceorg' => $serviceorg,
'principal_id' => $principal_id,
'rprojectstatus' => $rprojectstatus,
'progress' => $progress,
'lasttimes' => $lasttimes,
'latestcontent' => $latestcontent,
'latestattachment' => $latestattachment,
'direction' => $direction
];
if ($laborgid > 0) {
$orgSql = new \ciy\sql('lab_orgbase');
$orgSql->where('id = ?', $laborgid);
$orgInfo = $db->getone($orgSql);
if ($orgInfo) {
$updateData['orgname'] = $orgInfo['name'];
} else {
$updateData['orgname'] = null;
}
} else {
$updateData['orgname'] = null;
}
if ($principal_id > 0) {
$userSql = new \ciy\sql('lab_user');
$userSql->where('id = ?', $principal_id);
$userInfo = $db->getone($userSql);
if ($userInfo) {
$updateData['principal_name'] = $userInfo['name'];
} else {
$updateData['principal_name'] = null;
}
} else {
$updateData['principal_name'] = null;
}
try {
$db->begin();
$updateSql = new \ciy\sql('lab_rproject');
$updateSql->where('id = ?', $id);
if ($db->update($updateSql, $updateData) === false) {
throw new \Exception('更新项目基本信息失败: ' . $db->error);
}
if ($id > 0) {
$currentMemberSql = new \ciy\sql('lab_projectmember');
$currentMemberSql->where('pid = ?', $id);
foreach ($newMembers as $member) {
$mid = $member['mid'] ?? 0;
$uid = $member['uid'] ?? 0;
$prole = $member['prole'] ?? 10;
$isNew = $member['isNew'] ?? false;
$isDeleted = $member['isDeleted'] ?? false;
if ($isDeleted) {
if ($mid > 0) {
$delSql = new \ciy\sql('lab_projectmember');
$delSql->where('id = ?', $mid);
if ($db->delete($delSql) === false) {
throw new \Exception("删除成员失败 (ID: $mid): " . $db->error);
}
}
} elseif ($uid > 0) {
if ($isNew) {
// 对于新成员,先检查是否已存在 ---
$checkSql = new \ciy\sql('lab_projectmember');
$checkSql->where('pid = ? AND uid = ?', [$id, $uid]);
$existingRecord = $db->getone($checkSql);
if ($existingRecord) {
$updateMemberData = [
'prole' => $prole,
'utime' => time()
];
$updateSql = new \ciy\sql('lab_projectmember');
$updateSql->where('pid = ? AND uid = ?', [$id, $uid]);
if ($db->update($updateSql, $updateMemberData) === false) {
throw new \Exception("更新成员信息失败 (PID: $id, UID: $uid): " . $db->error);
}
$incomingMemberIds[] = $existingRecord['id'];
} else {
$insertMemberData = [
'pid' => $id,
'uid' => $uid,
'prole' => $prole,
'ctime' => time(),
'utime' => time()
];
$insertSql = new \ciy\sql('lab_projectmember');
if ($db->insert($insertSql, $insertMemberData) === false) {
throw new \Exception("添加新成员失败: " . $db->error);
}
$newlyInsertedId = $db->insert_id();
$incomingMemberIds[] = $newlyInsertedId;
}
} else {
if ($mid > 0) {
$updateMemberData = [
'uid' => $uid,
'prole' => $prole,
'utime' => time()
];
$updateSql = new \ciy\sql('lab_projectmember');
$updateSql->where('id = ?', $mid);
if ($db->update($updateSql, $updateMemberData) === false) {
throw new \Exception("更新成员信息失败 (ID: $mid): " . $db->error);
}
$incomingMemberIds[] = $mid;
}
}
}
}
}
$db->commit();
savelogdb($db, $rsuser['id'], 'lab_rproject', $originalData, $updateData);
$finalSql = new \ciy\sql('lab_rproject');
$finalSql->where('id = ?', $id);
$finalRow = $db->getone($finalSql);
return succjson(['data' => $finalRow]);
} catch (\Exception $e) {
$db->rollback();
return errjson($e->getMessage());
}
}
public static function json_del() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
$id = $post->getint('id');
$csql = new \ciy\sql('lab_rproject');
$csql->where('id = ?', $id);
$row = $db->getone($csql);
if (!is_array($row)) {
return errjson('项目数据不存在');
}
try {
$db->begin();
$delMemberSql = new \ciy\sql('lab_projectmember');
$delMemberSql->where('pid = ?', $id);
if ($db->delete($delMemberSql) === false) {
throw new \Exception('删除项目成员关联失败:' . $db->error);
}
delme($db, $row['id'], 'lab_rproject');
savelogdb($db, $rsuser['id'], 'lab_rproject', $row, null);
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
return errjson($ex->getMessage());
}
return succjson();
}
}
?>